25 #include <QCoreApplication> 34 static bool is_binary_file(
QString fn)
36 klfDbg(
"is_binary_file("<<fn<<
")") ;
39 klfDbg(
"is_binary_file: file doesn't exist directly, path search gave "<<fn) ;
42 if (!fpeek.open(QIODevice::ReadOnly)) {
43 klfDbg(
"fn="<<fn<<
", Can't peek into file "<<fn<<
"!") ;
48 while (n++ < 5 && (line = fpeek.readLine(1024)).size()) {
49 for (j = 0; j < line.
size(); ++j) {
50 if ((
int)line[j] >= 127 || (int)line[j] <= 0) {
51 klfDbg(
"fn="<<fn<<
" found binary char '"<<(
char)line[j]<<
"'=="<<(
int)line[j]
52 <<
" on line "<<n<<
", column "<< j) ;
57 klfDbg(
"fn="<<fn<<
", file seems to be ascii based on the first few lines") ;
62 const static QString script_extra_paths =
QString(
"C:\\Python27;C:\\Python*");
63 const static QString exe_suffix =
".exe";
64 #elif defined(Q_OS_MAC) 65 const static QString script_extra_paths =
66 "/usr/bin:/bin:/usr/local/bin:/usr/sbin:/sbin:/usr/local/sbin" 67 "/usr/local/opt/*/bin:/opt/local/bin:" 69 "/Library/TeX/texbin:/usr/texbin";
70 const static QString exe_suffix =
"";
72 const static QString script_extra_paths =
73 "/usr/bin:/bin:/usr/local/bin:/usr/sbin:/sbin:/usr/local/sbin";
74 const static QString exe_suffix =
"";
81 QString search_paths = script_extra_paths;
82 search_paths += addpaths.
join(KLF_PATH_SEP);
91 return klfSearchPath(interp+
"*"+exe_suffix, script_extra_paths);
100 mProcessAppEvents =
true;
101 connect(
this, SIGNAL(
finished(
int, QProcess::ExitStatus)),
this, SLOT(ourProcExited()));
109 void KLFBlockProcess::ourProcGotOurStdinData()
113 void KLFBlockProcess::ourProcExited()
123 return detectInterpreterPath(
"python");
124 }
else if (ext ==
"sh") {
125 return detectInterpreterPath(
"bash");
126 }
else if (ext ==
"rb") {
127 return detectInterpreterPath(
"ruby");
139 klfDbg(
"Running: "<<cmd<<
", stdindata/size="<<stdindata.
size());
150 if (!is_binary_file(cmd[0])) {
154 if (exec_proc.
size()) {
161 klfDbg(
"Running cmd="<<cmd);
164 if (env.
size() > 0) {
170 klfDbg(
"Starting "<<program<<
", "<<args) ;
171 start(program, args);
173 klfDbg(
"Can't wait for started! Error="<<
error()) ;
180 klfDbg(
"wrote input data (size="<<stdindata.
size()<<
")") ;
182 if (mProcessAppEvents) {
184 while (_runstatus == 0) {
186 klfDbg(
"events processed, maybe more?") ;
190 klfDbg(
"Can't wait for finished!");
194 klfDbg(
"Process should have finished now.");
196 if (_runstatus < 0) {
197 klfDbg(
"some error occurred, _runstatus="<<_runstatus) ;
Defines the KLFBlockProcess class.
virtual QString getInterpreterPath(const QString &ext)
The interpter path to use for the given extension.
QProcess::ProcessError error() const
KLF_EXPORT QString klfSearchPath(const QString &programName, const QString &extra_path)
#define klfDbg(streamableItems)
#define KLF_DEBUG_BLOCK(msg)
iterator erase(iterator pos)
QString join(const QString &separator) const
void processEvents(QEventLoop::ProcessEventsFlags flags)
const char * constData() const
void finished(int exitCode)
QByteArray toLocal8Bit() const
bool waitForStarted(int msecs)
bool startProcess(QStringList cmd, QByteArray stdindata, QStringList env=QStringList())
KLFBlockProcess(QObject *parent=0)
void setEnvironment(const QStringList &environment)
QThread * currentThread()
qint64 write(const char *data, qint64 maxSize)
void prepend(const T &value)
#define KLF_ASSERT_CONDITION(expr, msg, failaction)
QStringList environment() const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
void start(const QString &program, const QStringList &arguments, OpenMode mode)
bool waitForFinished(int msecs)