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;
virtual bool do_run(const QByteArray &indata, const QMap< QString, QByteArray *> outdatalist)
Actually run the process.
QMap< QString, QString > userScriptInterpreters
Defines the KLFBlockProcess class.
void setOutputStderr(bool on)
#define KLF_PRIVATE_HEAD(ClassName)
virtual QString getInterpreterPath(const QString &ext)
The interpter path to use for the given extension.
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)
#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
virtual bool open(OpenMode mode)
void setOutputStdout(bool on)
Definition of class KLFBackend.
const Key key(const T &value, const Key &defaultKey) const
QString & replace(int position, int n, QChar after)
#define KLF_INIT_PRIVATE(ClassName)
#define KLF_ASSERT_CONDITION(expr, msg, failaction)
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const
KLF_EXPORT QStringList klfCurrentEnvironment()
iterator find(const Key &key)
General settings for KLFBackend::getLatexFormula()
const T value(const Key &key, const T &defaultValue) const
void setProcessAppEvents(bool processEvents)