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 {
106 const QString& rundir,
bool inheritProcessEnvironment);
122 bool processAppEvents;
139 d->init(pTitle, settings, rundir,
false);
143 const QString& rundir,
bool inheritProcessEnvironment)
146 d->init(pTitle, settings, rundir, inheritProcessEnvironment);
150 const QString& rundir,
bool inheritProcessEnvironment)
154 collectStdout = NULL;
155 collectStderr = NULL;
158 outputStderr =
false;
165 if (settings != NULL) {
166 if (!rundir.
size()) {
167 programCwd = settings->
tempdir;
168 klfDbg(
"set programCwd to : "<<programCwd) ;
171 if (inheritProcessEnvironment) {
175 QStringList()<<
"PATH"<<
"TEXINPUTS"<<
"BIBINPUTS"<<
"PYTHONPATH",
176 KlfEnvPathPrepend|KlfEnvMergeExpandVars);
177 klfDbg(
"set execution environment to : "<<execEnviron) ;
182 processAppEvents =
true;
191 KLFFilterProcess::~KLFFilterProcess()
198 QString KLFFilterProcess::progTitle()
const
202 void KLFFilterProcess::setProgTitle(
const QString& title)
204 d->progTitle = title;
207 QString KLFFilterProcess::programCwd()
const
209 return d->programCwd;
211 void KLFFilterProcess::setProgramCwd(
const QString& cwd)
218 return d->execEnviron;
220 void KLFFilterProcess::setExecEnviron(
const QStringList& env)
222 d->execEnviron = env;
223 klfDbg(
"set exec environment: " << d->execEnviron);
225 void KLFFilterProcess::addExecEnviron(
const QStringList& env)
228 klfDbg(
"merged exec environment: " << d->execEnviron);
235 void KLFFilterProcess::setArgv(
const QStringList& argv)
239 void KLFFilterProcess::addArgv(
const QStringList& argv)
243 void KLFFilterProcess::addArgv(
const QString& argv)
248 bool KLFFilterProcess::outputStdout()
const
250 return d->outputStdout;
254 d->outputStdout = on;
257 bool KLFFilterProcess::outputStderr()
const
259 return d->outputStderr;
263 d->outputStderr = on;
269 d->collectStdout = stdoutstore;
274 d->collectStderr = stderrstore;
279 return d->processAppEvents;
284 d->processAppEvents = on;
289 return d->exitStatus;
302 return d->resErrorString;
307 return d->interpreters;
314 KLFFilterProcessBlockProcess proc(
this);
319 KLF_ASSERT_CONDITION(d->argv.size() > 0,
"argv array is empty! No program is given!",
return false; ) ;
321 proc.setWorkingDirectory(d->programCwd);
323 proc.setProcessAppEvents(d->processAppEvents);
325 klfDbg(
"about to exec "<<d->progTitle<<
" ...") ;
326 klfDbg(
"\t"<<qPrintable(d->argv.join(
" "))) ;
327 bool r = proc.startProcess(d->argv, indata, d->execEnviron);
328 klfDbg(d->progTitle<<
" returned.") ;
331 klfDbg(
"couldn't launch " << d->progTitle) ;
332 d->res = KLFFP_NOSTART;
333 d->resErrorString =
QObject::tr(
"Unable to start %1 program `%2'!",
"KLFBackend").
arg(d->progTitle, d->argv[0]);
336 if (!proc.processNormalExit()) {
337 klfDbg(d->progTitle<<
" did not exit normally (crashed)") ;
338 d->exitStatus = proc.exitStatus();
340 d->res = KLFFP_NOEXIT;
341 d->resErrorString =
QObject::tr(
"Program %1 crashed!",
"KLFBackend").
arg(d->progTitle);
344 if (proc.processExitStatus() != 0) {
346 d->exitCode = proc.processExitStatus();
347 klfDbg(d->progTitle<<
" exited with code "<<d->exitCode) ;
348 d->res = KLFFP_NOSUCCESSEXIT;
349 d->resErrorString = progErrorMsg(d->progTitle, proc.processExitStatus(), proc.readStderrString(),
350 proc.readStdoutString());
354 if (d->collectStdout != NULL) {
355 *d->collectStdout = proc.getAllStdout();
357 if (d->collectStderr != NULL) {
358 *d->collectStderr = proc.getAllStderr();
365 KLF_ASSERT_NOT_NULL(outdata,
"Given NULL outdata pointer for file "<<outFileName<<
" !",
return false; ) ;
368 <<
" to its corresponding QByteArray pointer="<<outdata) ;
373 if (d->outputStdout) {
374 QByteArray stdoutdata = (d->collectStdout != NULL) ? *d->collectStdout : proc.getAllStdout();
375 *outdata += stdoutdata;
377 if (d->outputStderr) {
378 QByteArray stderrdata = (d->collectStderr != NULL) ? *d->collectStderr : proc.getAllStderr();
379 *outdata += stderrdata;
383 QString stderrstr = (!d->outputStderr) ? (
"\n"+proc.readStderrString()) :
QString();
384 klfDbg(d->progTitle<<
" did not provide any data. Error message: "<<stderrstr);
385 d->res = KLFFP_NODATA;
386 d->resErrorString =
QObject::tr(
"Program %1 did not provide any output data.",
"KLFBackend")
387 .
arg(d->progTitle) + stderrstr;
395 klfDbg(
"File "<<outFileName<<
" did not appear after running "<<d->progTitle) ;
396 d->res = KLFFP_NODATA;
397 d->resErrorString =
QObject::tr(
"Output file didn't appear after having called %1!",
"KLFBackend")
403 QFile outfile(outFileName);
404 r = outfile.
open(QIODevice::ReadOnly);
406 klfDbg(
"File "<<outFileName<<
" cannot be read (after running "<<d->progTitle<<
")") ;
407 d->res = KLFFP_DATAREADFAIL;
408 d->resErrorString =
QObject::tr(
"Can't read file '%1'!\n",
"KLFBackend").
arg(outFileName);
413 klfDbg(
"Read file "<<outFileName<<
", got data, length="<<outdata->
size());
416 klfDbg(d->progTitle<<
" was successfully run and output successfully retrieved.") ;
421 d->res = KLFFP_NOERR;
430 if (!d->outputStdout || d->collectStdout == NULL) {
433 return *d->collectStdout;
437 if (!d->outputStderr || d->collectStderr == NULL) {
440 return *d->collectStderr;