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;
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)
virtual bool do_run(const QByteArray &indata, const QMap< QString, QByteArray * > outdatalist)
Actually run the process.
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)