1 | #include"qpipe.h"
|
---|
2 |
|
---|
3 | #ifdef Q_WS_WIN
|
---|
4 |
|
---|
5 | static uint readFromHandle(HANDLE h, char *buf, uint size)
|
---|
6 | {
|
---|
7 | if(size > 0) {
|
---|
8 | ulong r;
|
---|
9 | if(ReadFile(h, buf, size, &r, 0))
|
---|
10 | return r;
|
---|
11 | }
|
---|
12 | return 0;
|
---|
13 | }
|
---|
14 |
|
---|
15 | #else
|
---|
16 |
|
---|
17 | #include<unistd.h>
|
---|
18 | #include<fcntl.h>
|
---|
19 | #include<errno.h>
|
---|
20 |
|
---|
21 | #if defined(Q_OS_OS2) && defined(__INNOTEK_LIBC__)
|
---|
22 | #include<sys/socket.h>
|
---|
23 | #endif
|
---|
24 |
|
---|
25 | #endif
|
---|
26 |
|
---|
27 | //----------------------------------------------------------------------------
|
---|
28 | // QPipeEnd
|
---|
29 | //----------------------------------------------------------------------------
|
---|
30 | QPipeEnd::QPipeEnd()
|
---|
31 | {
|
---|
32 | reset();
|
---|
33 | }
|
---|
34 |
|
---|
35 | QPipeEnd::~QPipeEnd()
|
---|
36 | {
|
---|
37 | close();
|
---|
38 | }
|
---|
39 |
|
---|
40 | void QPipeEnd::reset()
|
---|
41 | {
|
---|
42 | #ifdef Q_WS_WIN
|
---|
43 | p = 0;
|
---|
44 | #else
|
---|
45 | p = -1;
|
---|
46 | #endif
|
---|
47 | }
|
---|
48 |
|
---|
49 | bool QPipeEnd::isOpen() const
|
---|
50 | {
|
---|
51 | #ifdef Q_WS_WIN
|
---|
52 | return (p ? true: false);
|
---|
53 | #else
|
---|
54 | return (p != -1 ? true: false);
|
---|
55 | #endif
|
---|
56 | }
|
---|
57 |
|
---|
58 | const QPipeId & QPipeEnd::id() const
|
---|
59 | {
|
---|
60 | return p;
|
---|
61 | }
|
---|
62 |
|
---|
63 | void QPipeEnd::setId(const QPipeId &x)
|
---|
64 | {
|
---|
65 | p = x;
|
---|
66 | }
|
---|
67 |
|
---|
68 | void QPipeEnd::close()
|
---|
69 | {
|
---|
70 | if(!isOpen())
|
---|
71 | return;
|
---|
72 | #ifdef Q_WS_WIN
|
---|
73 | CloseHandle(p);
|
---|
74 | #else
|
---|
75 | ::close(p);
|
---|
76 | #endif
|
---|
77 | reset();
|
---|
78 | }
|
---|
79 |
|
---|
80 | void QPipeEnd::release()
|
---|
81 | {
|
---|
82 | reset();
|
---|
83 | }
|
---|
84 |
|
---|
85 | QString QPipeEnd::toString() const
|
---|
86 | {
|
---|
87 | #ifdef Q_WS_WIN
|
---|
88 | DWORD dw;
|
---|
89 | memcpy(&dw, &p, sizeof(DWORD));
|
---|
90 | return QString::number(dw);
|
---|
91 | #else
|
---|
92 | return QString::number(p);
|
---|
93 | #endif
|
---|
94 | }
|
---|
95 |
|
---|
96 | int QPipeEnd::write(const QByteArray &buf)
|
---|
97 | {
|
---|
98 | #ifdef Q_WS_WIN
|
---|
99 | DWORD written;
|
---|
100 | if(!WriteFile(p, buf.data(), buf.size(), &written, 0))
|
---|
101 | return -1;
|
---|
102 | return written;
|
---|
103 | #else
|
---|
104 | return (::write(p, buf.data(), buf.size()));
|
---|
105 | #endif
|
---|
106 | }
|
---|
107 |
|
---|
108 | QByteArray QPipeEnd::readAll(bool *done)
|
---|
109 | {
|
---|
110 | #ifdef Q_WS_WIN
|
---|
111 | if(done)
|
---|
112 | *done = false;
|
---|
113 | unsigned long i, r;
|
---|
114 | char dummy;
|
---|
115 | if(!PeekNamedPipe(p, &dummy, 1, &r, &i, 0))
|
---|
116 | return QByteArray();
|
---|
117 | if(i <= 0)
|
---|
118 | return QByteArray();
|
---|
119 |
|
---|
120 | QByteArray buf;
|
---|
121 | buf.resize(i);
|
---|
122 | int size = readFromHandle(p, buf.data(), i);
|
---|
123 | if(size == 0)
|
---|
124 | return QByteArray();
|
---|
125 | return buf;
|
---|
126 | #else
|
---|
127 | if(done)
|
---|
128 | *done = false;
|
---|
129 | QByteArray buf;
|
---|
130 | while(1) {
|
---|
131 | char block[1024];
|
---|
132 | int n = read(p, block, 1024);
|
---|
133 | if(n < 0) {
|
---|
134 | if(errno == EAGAIN) {
|
---|
135 | break;
|
---|
136 | }
|
---|
137 | else {
|
---|
138 | if(done)
|
---|
139 | *done = true;
|
---|
140 | break;
|
---|
141 | }
|
---|
142 | }
|
---|
143 | else if(n == 0) {
|
---|
144 | if(done)
|
---|
145 | *done = true;
|
---|
146 | break;
|
---|
147 | }
|
---|
148 |
|
---|
149 | int oldsize = buf.size();
|
---|
150 | buf.resize(oldsize + n);
|
---|
151 | memcpy(buf.data() + oldsize, block, n);
|
---|
152 | }
|
---|
153 |
|
---|
154 | return buf;
|
---|
155 | #endif
|
---|
156 | }
|
---|
157 |
|
---|
158 | #ifdef Q_WS_WIN
|
---|
159 | bool QPipeEnd::winDupHandle()
|
---|
160 | {
|
---|
161 | HANDLE h;
|
---|
162 | if(!DuplicateHandle(GetCurrentProcess(), p, GetCurrentProcess(), &h, 0, FALSE, DUPLICATE_SAME_ACCESS))
|
---|
163 | return false;
|
---|
164 | CloseHandle(p);
|
---|
165 | p = h;
|
---|
166 | return true;
|
---|
167 | }
|
---|
168 |
|
---|
169 | #else
|
---|
170 |
|
---|
171 | bool QPipeEnd::setBlock(bool b)
|
---|
172 | {
|
---|
173 | int flags = fcntl(p, F_GETFL);
|
---|
174 | if(!b)
|
---|
175 | flags |= O_NONBLOCK;
|
---|
176 | else
|
---|
177 | flags &= ~O_NONBLOCK;
|
---|
178 | if(fcntl(p, F_SETFL, flags) == -1)
|
---|
179 | return false;
|
---|
180 | return true;
|
---|
181 | }
|
---|
182 | #endif
|
---|
183 |
|
---|
184 |
|
---|
185 | //----------------------------------------------------------------------------
|
---|
186 | // QPipe
|
---|
187 | //----------------------------------------------------------------------------
|
---|
188 | QPipe::QPipe()
|
---|
189 | {
|
---|
190 | }
|
---|
191 |
|
---|
192 | QPipe::~QPipe()
|
---|
193 | {
|
---|
194 | close();
|
---|
195 | }
|
---|
196 |
|
---|
197 | void QPipe::closeReadEnd()
|
---|
198 | {
|
---|
199 | i.close();
|
---|
200 | }
|
---|
201 |
|
---|
202 | void QPipe::closeWriteEnd()
|
---|
203 | {
|
---|
204 | o.close();
|
---|
205 | }
|
---|
206 |
|
---|
207 | int QPipe::write(const QByteArray &buf)
|
---|
208 | {
|
---|
209 | return o.write(buf);
|
---|
210 | }
|
---|
211 |
|
---|
212 | QByteArray QPipe::readAll(bool *done)
|
---|
213 | {
|
---|
214 | return i.readAll(done);
|
---|
215 | }
|
---|
216 |
|
---|
217 | bool QPipe::open()
|
---|
218 | {
|
---|
219 | close();
|
---|
220 |
|
---|
221 | #ifdef Q_WS_WIN
|
---|
222 | SECURITY_ATTRIBUTES secAttr;
|
---|
223 | memset(&secAttr, 0, sizeof secAttr);
|
---|
224 | secAttr.nLength = sizeof secAttr;
|
---|
225 | secAttr.bInheritHandle = TRUE;
|
---|
226 |
|
---|
227 | HANDLE r, w;
|
---|
228 | if(!CreatePipe(&r, &w, &secAttr, 0))
|
---|
229 | return false;
|
---|
230 | i.setId(r);
|
---|
231 | o.setId(w);
|
---|
232 | #else
|
---|
233 | int p[2];
|
---|
234 | #if defined(Q_OS_OS2) && defined(__INNOTEK_LIBC__)
|
---|
235 | if(socketpair(AF_LOCAL, SOCK_STREAM, 0, p) == -1)
|
---|
236 | #else
|
---|
237 | if(pipe(p) == -1)
|
---|
238 | #endif
|
---|
239 | return false;
|
---|
240 | i.setId(p[0]);
|
---|
241 | o.setId(p[1]);
|
---|
242 | #endif
|
---|
243 | return true;
|
---|
244 | }
|
---|
245 |
|
---|
246 | void QPipe::close()
|
---|
247 | {
|
---|
248 | i.close();
|
---|
249 | o.close();
|
---|
250 | }
|
---|
251 |
|
---|
252 | void QPipe::release()
|
---|
253 | {
|
---|
254 | i.release();
|
---|
255 | o.release();
|
---|
256 | }
|
---|