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);
77KLFFilterProcessBlockProcess::KLFFilterProcessBlockProcess(
KLFFilterProcess * fproc)
81KLFFilterProcessBlockProcess::~KLFFilterProcessBlockProcess()
84QString KLFFilterProcessBlockProcess::getInterpreterPath(
const QString& ext)
90 if (it != interpreters.
end()) {
100struct 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;
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;
220void KLFFilterProcess::setExecEnviron(
const QStringList& env)
222 d->execEnviron = env;
223 klfDbg(
"set exec environment: " << d->execEnviron);
225void KLFFilterProcess::addExecEnviron(
const QStringList& env)
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;
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;
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()
virtual bool open(OpenMode mode)
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
QString & replace(int position, int n, QChar after)
General settings for KLFBackend::getLatexFormula()
QMap< QString, QString > userScriptInterpreters