32 #include "klffilterprocess.h" 34 #include "klffilterprocess_p.h" 43 stdouthtml.
replace(
"&",
"&");
44 stdouthtml.
replace(
"<",
"<");
45 stdouthtml.
replace(
">",
">");
46 stderrhtml.
replace(
"&",
"&");
47 stderrhtml.
replace(
"<",
"<");
48 stderrhtml.
replace(
">",
">");
51 return QObject::tr(
"<p><b>%1</b> reported an error (exit status %2). No Output was generated.</p>",
53 .
arg(progname).
arg(exitstatus);
56 QObject::tr(
"<p><b>%1</b> reported an error (exit status %2). Here is full stdout output:</p>\n" 57 "<pre>\n%3</pre>",
"KLFBackend")
58 .
arg(progname).
arg(exitstatus).
arg(stdouthtml);
61 QObject::tr(
"<p><b>%1</b> reported an error (exit status %2). Here is full stderr output:</p>\n" 62 "<pre>\n%3</pre>",
"KLFBackend")
63 .
arg(progname).
arg(exitstatus).
arg(stderrhtml);
65 return QObject::tr(
"<p><b>%1</b> reported an error (exit status %2). Here is full stderr output:</p>\n" 66 "<pre>\n%3</pre><p>And here is full stdout output:</p><pre>\n%4</pre>",
"KLFBackend")
67 .
arg(progname).
arg(exitstatus).
arg(stderrhtml).
arg(stdouthtml);
77 KLFFilterProcessBlockProcess::KLFFilterProcessBlockProcess(
KLFFilterProcess * fproc)
81 KLFFilterProcessBlockProcess::~KLFFilterProcessBlockProcess()
84 QString KLFFilterProcessBlockProcess::getInterpreterPath(
const QString& ext)
90 if (it != interpreters.
end()) {
100 struct KLFFilterProcessPrivate {
119 bool processAppEvents;
137 d->progTitle = pTitle;
139 d->collectStdout = NULL;
140 d->collectStderr = NULL;
142 d->outputStdout =
true;
143 d->outputStderr =
false;
148 d->programCwd = rundir;
150 if (settings != NULL) {
151 if (!rundir.
size()) {
152 d->programCwd = settings->
tempdir;
153 klfDbg(
"set programCwd to : "<<d->programCwd) ;
156 KlfEnvPathPrepend|KlfEnvMergeExpandVars);
157 klfDbg(
"set execution environment to : "<<d->execEnviron) ;
162 d->processAppEvents =
true;
170 KLFFilterProcess::~KLFFilterProcess()
177 QString KLFFilterProcess::progTitle()
const 181 void KLFFilterProcess::setProgTitle(
const QString& title)
183 d->progTitle = title;
186 QString KLFFilterProcess::programCwd()
const 188 return d->programCwd;
190 void KLFFilterProcess::setProgramCwd(
const QString& cwd)
197 return d->execEnviron;
199 void KLFFilterProcess::setExecEnviron(
const QStringList& env)
201 d->execEnviron = env;
202 klfDbg(
"set exec environment: " << d->execEnviron);
204 void KLFFilterProcess::addExecEnviron(
const QStringList& env)
207 klfDbg(
"merged exec environment: " << d->execEnviron);
214 void KLFFilterProcess::setArgv(
const QStringList& argv)
218 void KLFFilterProcess::addArgv(
const QStringList& argv)
222 void KLFFilterProcess::addArgv(
const QString& argv)
227 bool KLFFilterProcess::outputStdout()
const 229 return d->outputStdout;
233 d->outputStdout = on;
236 bool KLFFilterProcess::outputStderr()
const 238 return d->outputStderr;
242 d->outputStderr = on;
247 setOutputStdout(
true);
248 d->collectStdout = stdoutstore;
252 setOutputStderr(
true);
253 d->collectStderr = stderrstore;
258 return d->processAppEvents;
263 d->processAppEvents = on;
268 return d->exitStatus;
281 return d->resErrorString;
286 return d->interpreters;
298 KLF_ASSERT_CONDITION(d->argv.size() > 0,
"argv array is empty! No program is given!",
return false; ) ;
304 klfDbg(
"about to exec "<<d->progTitle<<
" ...") ;
305 klfDbg(
"\t"<<qPrintable(d->argv.join(
" "))) ;
306 bool r = proc.
startProcess(d->argv, indata, d->execEnviron);
307 klfDbg(d->progTitle<<
" returned.") ;
310 klfDbg(
"couldn't launch " << d->progTitle) ;
311 d->res = KLFFP_NOSTART;
312 d->resErrorString =
QObject::tr(
"Unable to start %1 program `%2'!",
"KLFBackend").
arg(d->progTitle, d->argv[0]);
316 klfDbg(d->progTitle<<
" did not exit normally (crashed)") ;
319 d->res = KLFFP_NOEXIT;
320 d->resErrorString =
QObject::tr(
"Program %1 crashed!",
"KLFBackend").
arg(d->progTitle);
326 klfDbg(d->progTitle<<
" exited with code "<<d->exitCode) ;
327 d->res = KLFFP_NOSUCCESSEXIT;
333 if (d->collectStdout != NULL) {
336 if (d->collectStderr != NULL) {
344 KLF_ASSERT_NOT_NULL(outdata,
"Given NULL outdata pointer for file "<<outFileName<<
" !",
return false; ) ;
347 <<
" to its corresponding QByteArray pointer="<<outdata) ;
352 if (d->outputStdout) {
354 *outdata += stdoutdata;
356 if (d->outputStderr) {
358 *outdata += stderrdata;
363 klfDbg(d->progTitle<<
" did not provide any data. Error message: "<<stderrstr);
364 d->res = KLFFP_NODATA;
365 d->resErrorString =
QObject::tr(
"Program %1 did not provide any output data.",
"KLFBackend")
366 .
arg(d->progTitle) + stderrstr;
374 klfDbg(
"File "<<outFileName<<
" did not appear after running "<<d->progTitle) ;
375 d->res = KLFFP_NODATA;
376 d->resErrorString =
QObject::tr(
"Output file didn't appear after having called %1!",
"KLFBackend")
382 QFile outfile(outFileName);
383 r = outfile.
open(QIODevice::ReadOnly);
385 klfDbg(
"File "<<outFileName<<
" cannot be read (after running "<<d->progTitle<<
")") ;
386 d->res = KLFFP_DATAREADFAIL;
387 d->resErrorString =
QObject::tr(
"Can't read file '%1'!\n",
"KLFBackend").
arg(outFileName);
392 klfDbg(
"Read file "<<outFileName<<
", got data, length="<<outdata->
size());
395 klfDbg(d->progTitle<<
" was successfully run and output successfully retrieved.") ;
400 d->res = KLFFP_NOERR;
409 if (!d->outputStdout || d->collectStdout == NULL) {
412 return *d->collectStdout;
416 if (!d->outputStderr || d->collectStderr == NULL) {
419 return *d->collectStderr;
virtual bool do_run(const QByteArray &indata, const QMap< QString, QByteArray *> outdatalist)
Actually run the process.
QMap< QString, QString > userScriptInterpreters
Defines the KLFBlockProcess class.
QString readStdoutString()
void setOutputStderr(bool on)
#define KLF_PRIVATE_HEAD(ClassName)
virtual QString getInterpreterPath(const QString &ext)
The interpter path to use for the given extension.
void setProcessAppEvents(bool processAppEvents)
virtual int exitStatus() const
void klfMergeEnvironment(QStringList *env, const QStringList &addvars, const QStringList &pathvars, uint actions)
#define klfDbg(streamableItems)
#define KLF_DEBUG_BLOCK(msg)
virtual int resultStatus() const
void collectStdoutTo(QByteArray *stdoutstore)
QByteArray collectedStderr() const
The collected stderr data of the process that just ran.
A QProcess subclass for code-blocking process execution.
virtual int exitCode() const
QString tr(const char *sourceText, const char *disambiguation, int n)
void collectStderrTo(QByteArray *stderrstore)
bool processNormalExit() const
#define KLF_ASSERT_NOT_NULL(ptr, msg, failaction)
#define KLF_DELETE_PRIVATE
QByteArray collectedStdout() const
The collected stdout data of the process that just ran.
virtual QString resultErrorString() const
QString readStderrString()
virtual bool open(OpenMode mode)
void setOutputStdout(bool on)
void setWorkingDirectory(const QString &dir)
bool startProcess(QStringList cmd, QByteArray stdindata, QStringList env=QStringList())
Definition of class KLFBackend.
const Key key(const T &value, const Key &defaultKey) const
QString & replace(int position, int n, QChar after)
QByteArray getAllStderr()
#define KLF_INIT_PRIVATE(ClassName)
#define KLF_ASSERT_CONDITION(expr, msg, failaction)
int processExitStatus() const
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const
iterator find(const Key &key)
QProcess::ExitStatus exitStatus() const
General settings for KLFBackend::getLatexFormula()
const T value(const Key &key, const T &defaultValue) const
QByteArray getAllStdout()
void setProcessAppEvents(bool processEvents)