32#include "klffilterprocess.h"
34#include "klffilterprocess_p.h"
51 return QObject::tr(
"<p><b>%1</b> reported an error (exit status %2). No Output was generated.</p>",
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")
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")
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")
81KLFFilterProcessBlockProcess::~KLFFilterProcessBlockProcess()
90 if (
it != interpreters.
end()) {
100struct KLFFilterProcessPrivate {
122 bool processAppEvents;
154 collectStdout =
NULL;
155 collectStderr =
NULL;
158 outputStderr =
false;
165 if (settings !=
NULL) {
167 programCwd = settings->
tempdir;
168 klfDbg(
"set programCwd to : "<<programCwd) ;
175 QStringList()<<
"PATH"<<
"TEXINPUTS"<<
"BIBINPUTS"<<
"PYTHONPATH",
176 KlfEnvPathPrepend|KlfEnvMergeExpandVars);
177 klfDbg(
"set execution environment to : "<<execEnviron) ;
182 processAppEvents =
true;
191KLFFilterProcess::~KLFFilterProcess()
198QString KLFFilterProcess::progTitle()
const
202void KLFFilterProcess::setProgTitle(
const QString& title)
204 d->progTitle = title;
207QString KLFFilterProcess::programCwd()
const
209 return d->programCwd;
211void KLFFilterProcess::setProgramCwd(
const QString&
cwd)
218 return d->execEnviron;
222 d->execEnviron =
env;
223 klfDbg(
"set exec environment: " << d->execEnviron);
228 klfDbg(
"merged exec environment: " << d->execEnviron);
235void KLFFilterProcess::setArgv(
const QStringList& argv)
239void KLFFilterProcess::addArgv(
const QStringList& argv)
243void KLFFilterProcess::addArgv(
const QString& argv)
248bool KLFFilterProcess::outputStdout()
const
250 return d->outputStdout;
254 d->outputStdout =
on;
257bool KLFFilterProcess::outputStderr()
const
259 return d->outputStderr;
263 d->outputStderr =
on;
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<<
" ...") ;
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();
368 <<
" to its corresponding QByteArray pointer="<<
outdata) ;
373 if (d->outputStdout) {
377 if (d->outputStderr) {
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")
396 d->res = KLFFP_NODATA;
397 d->resErrorString =
QObject::tr(
"Output file didn't appear after having called %1!",
"KLFBackend")
404 r =
outfile.open(QIODevice::ReadOnly);
406 klfDbg(
"File "<<
outFileName<<
" cannot be read (after running "<<d->progTitle<<
")") ;
407 d->res = KLFFP_DATAREADFAIL;
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;
A QProcess subclass for code-blocking process execution.
virtual QString getInterpreterPath(const QString &ext)
The interpter path to use for the given extension.
virtual int exitCode() const
void collectStderrTo(QByteArray *stderrstore)
virtual bool do_run(const QByteArray &indata, const QMap< QString, QByteArray * > outdatalist)
Actually run the process.
QByteArray collectedStdout() const
The collected stdout data of the process that just ran.
void setOutputStderr(bool on)
QByteArray collectedStderr() const
The collected stderr data of the process that just ran.
virtual QString resultErrorString() const
virtual int resultStatus() const
void collectStdoutTo(QByteArray *stdoutstore)
virtual int exitStatus() const
void setProcessAppEvents(bool processEvents)
void setOutputStdout(bool on)
Definition of class KLFBackend.
Defines the KLFBlockProcess class.
#define KLF_DEBUG_BLOCK(msg)
#define KLF_ASSERT_NOT_NULL(ptr, msg, failaction)
#define KLF_ASSERT_CONDITION(expr, msg, failaction)
#define klfDbg(streamableItems)
#define KLF_PRIVATE_HEAD(ClassName)
#define KLF_DELETE_PRIVATE
#define KLF_INIT_PRIVATE(ClassName)
void klfMergeEnvironment(QStringList *env, const QStringList &addvars, const QStringList &pathvars, uint actions)
KLF_EXPORT QStringList klfCurrentEnvironment()
iterator find(const Key &key)
const Key key(const T &value, const Key &defaultKey) const
const T value(const Key &key, const T &defaultValue) const
QString tr(const char *sourceText, const char *disambiguation, int n)
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const
General settings for KLFBackend::getLatexFormula()
QMap< QString, QString > userScriptInterpreters