3
maybe have a queue for aux/command ??
8
#include<qsocketnotifier.h>
10
#include"safedelete.h"
21
//----------------------------------------------------------------------------
23
//----------------------------------------------------------------------------
24
class GPGProc::Private
37
QPipe pipeAux, pipeCommand, pipeStatus;
40
QSocketNotifier *snStatus;
58
d->proc->disconnect(this);
59
if(d->proc->isRunning())
61
d->sd.deleteLater(d->proc);
67
void GPGProc::closePipes()
70
d->pipeCommand.close();
71
d->pipeStatus.close();
79
bool GPGProc::isRunning() const
81
return d->proc->isRunning();
84
bool GPGProc::normalExit() const
86
return d->proc->normalExit();
89
int GPGProc::exitStatus() const
91
return d->proc->exitStatus();
94
bool GPGProc::start(const QString &bin, const QStringList &args, bool useExtra)
98
d->proc->disconnect(this);
99
d->sd.deleteLater(d->proc);
102
d->statusbuf.resize(0);
104
if(!d->pipeAux.open()) {
106
printf("Error creating pipeAux\n");
111
if(!d->pipeCommand.open()) {
113
printf("Error creating pipeCommand\n");
118
if(!d->pipeStatus.open()) {
120
printf("Error creating pipeStatus\n");
128
if(!d->pipeAux.writeEnd().winDupHandle()) {
130
printf("Error dup'ing pipeAux\n");
135
if(!d->pipeCommand.writeEnd().winDupHandle()) {
137
printf("Error dup'ing pipeCommand\n");
142
if(!d->pipeStatus.readEnd().winDupHandle()) {
144
printf("Error dup'ing pipeStatus\n");
152
connect(d->t, SIGNAL(timeout()), SLOT(timeout()));
155
// status socket notifier
156
d->pipeStatus.readEnd().setBlock(false);
157
d->snStatus = new QSocketNotifier(d->pipeStatus.readEnd().id(), QSocketNotifier::Read);
158
connect(d->snStatus, SIGNAL(activated(int)), SLOT(sn_activated(int)));
162
// test: write some data into the pipe
163
QCString cs = "Foobar";
164
d->pipeStatus.write(cs);
165
QByteArray buf = d->pipeStatus.readAll();
166
QCString cs2 = buf.data();
168
printf("Pipe test failed.\n");
170
printf("Pipe test succeeded.\n");
174
d->proc = new QProcess;
176
d->proc = new SProcess;
180
printf("Pipe setup complete.\n");
183
QStringList fullargs;
185
fullargs += "--no-tty";
188
fullargs += "--enable-special-filenames";
190
fullargs += "--status-fd";
191
fullargs += d->pipeStatus.writeEnd().toString();
193
fullargs += "--command-fd";
194
fullargs += d->pipeCommand.readEnd().toString();
197
for(QStringList::ConstIterator it = args.begin(); it != args.end(); ++it) {
198
const QString &a = (*it);
200
fullargs += (QString("-&") + d->pipeAux.readEnd().toString());
208
for(QStringList::ConstIterator it2 = fullargs.begin(); it2 != fullargs.end(); ++it2) {
209
printf("%s ", (*it2).latin1());
214
d->proc->setArguments(fullargs);
217
QValueList<int> plist;
218
plist += d->pipeAux.writeEnd().id();
219
plist += d->pipeCommand.writeEnd().id();
220
plist += d->pipeStatus.readEnd().id();
221
d->proc->setClosePipeList(plist);
224
connect(d->proc, SIGNAL(readyReadStdout()), SLOT(proc_readyReadStdout()));
225
connect(d->proc, SIGNAL(readyReadStderr()), SLOT(proc_readyReadStderr()));
226
connect(d->proc, SIGNAL(wroteToStdin()), SLOT(proc_wroteToStdin()));
227
connect(d->proc, SIGNAL(processExited()), SLOT(proc_processExited()));
229
bool ok = d->proc->start();
231
// we don't care about these
232
d->pipeAux.closeReadEnd();
233
d->pipeCommand.closeReadEnd();
234
d->pipeStatus.closeWriteEnd();
238
d->proc->disconnect(this);
239
d->sd.deleteLater(d->proc);
247
void GPGProc::writeToStdin(const QByteArray &buf)
249
d->proc->writeToStdin(buf);
252
void GPGProc::writeToAux(const QByteArray &buf)
254
d->pipeAux.write(buf);
258
void GPGProc::writeToCommand(const QByteArray &buf)
260
d->pipeCommand.write(buf);
264
void GPGProc::closeStdin()
266
d->proc->closeStdin();
269
void GPGProc::closeAux()
274
void GPGProc::closeCommand()
276
d->pipeCommand.close();
279
QByteArray GPGProc::readStdout()
281
return d->proc->readStdout();
284
QByteArray GPGProc::readStderr()
286
return d->proc->readStderr();
289
void GPGProc::proc_readyReadStdout()
291
SafeDeleteLock s(&d->sd);
295
void GPGProc::proc_readyReadStderr()
297
SafeDeleteLock s(&d->sd);
301
void GPGProc::proc_wroteToStdin()
303
SafeDeleteLock s(&d->sd);
307
void GPGProc::proc_processExited()
309
SafeDeleteLock s(&d->sd);
316
// maybe there is some status left??
317
QByteArray buf = d->pipeStatus.readAll();
319
processStatusData(buf);
325
void GPGProc::timeout()
327
QByteArray buf = d->pipeStatus.readAll();
329
processStatusData(buf);
332
void GPGProc::sn_activated(int)
336
void GPGProc::timeout()
340
void GPGProc::sn_activated(int)
343
QByteArray buf = d->pipeStatus.readAll(&done);
345
d->pipeStatus.close();
350
processStatusData(buf);
354
void GPGProc::processStatusData(const QByteArray &buf)
356
// append to the statusbuf
357
int oldsize = d->statusbuf.size();
358
d->statusbuf.resize(oldsize + buf.size());
359
memcpy(d->statusbuf.data() + oldsize, buf.data(), buf.size());
365
int len = d->statusbuf.size();
366
char *p = (char *)d->statusbuf.data();
367
for(; n < len; ++n) {
374
// extract the string from statusbuf
378
memcpy(cs.data(), p, n);
379
int newsize = len - n;
380
memmove(p, p + n, newsize);
381
d->statusbuf.resize(newsize);
383
// convert to string without newline
384
QString str = QString::fromUtf8(cs);
385
str.truncate(str.length()-1);
386
// ensure it has a proper header
387
if(str.left(9) != "[GNUPG:] ")
395
for(QStringList::ConstIterator it = list.begin(); it != list.end(); ++it)