-
Notifications
You must be signed in to change notification settings - Fork 0
/
cmdpipefilter.cpp
executable file
·103 lines (78 loc) · 2.92 KB
/
cmdpipefilter.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/******************************************************************************
**
** Copyright 2009 Jocelyn Turcotte
**
** This file is part of GoofyProxy.
**
** GoofyProxy is free software: you can redistribute it and/or modify it under
** the terms of the GNU General Public License as published by the
** Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** GoofyProxy is distributed in the hope that it will be useful, but WITHOUT
** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
** FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
** for more details.
**
** You should have received a copy of the GNU General Public License along
** with GoofyProxy. If not, see http://www.gnu.org/licenses/.
**
******************************************************************************/
#include "cmdpipefilter.h"
#include <QBuffer>
#include <QDebug>
#include <QHttpResponseHeader>
CmdPipeFilter::CmdPipeFilter(QObject* parent, QBuffer* src, QIODevice* dst, QString command, QStringList args)
: AHttpFilter(parent)
, command_(command)
, args_(args)
, src_(src)
, dst_(dst)
, cmdProcess_(NULL)
{
}
void CmdPipeFilter::handleResponse(const QHttpResponseHeader& resp)
{
dst_->write(resp.toString().toAscii());
cmdProcess_ = new QProcess(this);
connect(cmdProcess_, SIGNAL(readyRead()), this, SLOT(onCmdProcessReadyRead()));
connect(cmdProcess_, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(onCmdProcessFinished(int,QProcess::ExitStatus)));
connect(cmdProcess_, SIGNAL(error(QProcess::ProcessError)), this, SLOT(onCmdProcessError(QProcess::ProcessError)));
cmdProcess_->start(command_, args_);
connect(src_, SIGNAL(aboutToClose()), this, SLOT(onSrcAboutToClose()));
connect(src_, SIGNAL(readyRead()), this, SLOT(onSrcReadyRead()));
// Catch up on any readyRead() signal we may have missed
onSrcReadyRead();
}
void CmdPipeFilter::onSrcAboutToClose()
{
onSrcReadyRead();
cmdProcess_->closeWriteChannel();
}
void CmdPipeFilter::onCmdProcessReadyRead()
{
dst_->write(cmdProcess_->readAll());
}
void CmdPipeFilter::onCmdProcessFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
if (exitCode != 0 || exitStatus != QProcess::NormalExit)
{
qWarning("!!! Command [%s] exited with code [%d] and exitStatus [%d]", command_.toAscii().data(), exitCode, exitStatus);
QByteArray stderrText = cmdProcess_->readAllStandardError();
if (stderrText.length() > 0)
qWarning(" stderr: %s", stderrText.data());
}
finished();
}
void CmdPipeFilter::onCmdProcessError(QProcess::ProcessError error)
{
qCritical("!!! Error executing command [%s], ProcessError [%d] returned", command_.toAscii().data(), error);
finished();
}
void CmdPipeFilter::onSrcReadyRead()
{
src_->reset();
cmdProcess_->write(src_->readAll());
src_->buffer().resize(0);
src_->reset();
}