* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
- * \author Peter Kümmel
+ * \author Enrico Forestieri
*
* Full author contact details are available in file CREDITS.
*/
-#ifndef LYX_SUPPORT_SYSTEMCALLPRIVATE_H
-#define LYX_SUPPORT_SYSTEMCALLPRIVATE_H
+#ifndef SYSTEMCALLPRIVATE_H
+#define SYSTEMCALLPRIVATE_H
#include <QObject>
#include <QProcess>
#include <string>
-
namespace lyx {
namespace support {
-class ProgressInterface;
+class Systemcall;
+/**
+ * Outputs to the console terminal the line buffered standard output and
+ * error of a spawned process when there is a controlling terminal and
+ * stdout/stderr have not been redirected.
+ */
class SystemcallPrivate : public QObject
{
Q_OBJECT
public:
- SystemcallPrivate();
+ SystemcallPrivate(std::string const & infile, std::string const & outfile,
+ std::string const & errfile);
+ ~SystemcallPrivate();
+
+ enum State {
+ Starting,
+ Running,
+ Finished,
+ Error
+ };
+ State state;
+
+ bool waitWhile(State, bool processEvents, int timeout = -1);
+ void startProcess(QString const & cmd, std::string const & path, bool detach);
+
+ int exitCode();
+
+ QString errorMessage() const;
+ QString exitStatusMessage() const;
+
+ QProcess* releaseProcess();
+
+ static void killProcess(QProcess * p);
- // When waitForFinished == true : returns the exit code of the process
- // When waitForFinished == false: returns 0 if the process could be started
- int start(const std::string& cmd, bool waitForFinished);
public Q_SLOTS:
- void newProcessOutput();
- void processStarted();
+ void stdOut();
+ void stdErr();
void processError(QProcess::ProcessError);
- void processFinished(int, QProcess::ExitStatus);
-
+ void processStarted();
+ void processFinished(int, QProcess::ExitStatus status);
+
+
private:
- QProcess process;
-};
+ /// Pointer to the process to monitor.
+ QProcess * process_;
+ /// Index to the standard output buffer.
+ size_t out_index_;
+ /// Index to the standard error buffer.
+ size_t err_index_;
+ ///
+ std::string in_file_;
+ ///
+ std::string out_file_;
+ ///
+ std::string err_file_;
+
+ /// Size of buffers.
+ static size_t const buffer_size_ = 200;
+ /// Standard output buffer.
+ char out_data_[buffer_size_];
+ /// Standard error buffer.
+ char err_data_[buffer_size_];
+
+ QString cmd_;
+ bool process_events_;
+
+ void waitAndProcessEvents();
+ void processEvents();
+ void killProcess();
+
+};
} // namespace support
} // namespace lyx
-#endif // LYX_SUPPORT_SYSTEMCALLPRIVATE_H
+#endif // SYSTEMCALLPRIVATE_H