X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2FSystemcallPrivate.h;h=6ab479f73c329fd5b68a786b9cd6a608c478e9a2;hb=b96ce9a9c101a711ef8a1cdd5d6fe812a18966da;hp=38d42e21e2f00628226eed6e4f9dc7295e95d531;hpb=3af56311a7bddc491fa01457bdb5e9efa2dd31d8;p=lyx.git diff --git a/src/support/SystemcallPrivate.h b/src/support/SystemcallPrivate.h index 38d42e21e2..6ab479f73c 100644 --- a/src/support/SystemcallPrivate.h +++ b/src/support/SystemcallPrivate.h @@ -4,48 +4,107 @@ * 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 #include #include - 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, + Killed + }; + State state; + + bool waitWhile(State, bool processEvents, int timeout = -1); + void startProcess(QString const & cmd, std::string const & path, + std::string const & lpath, bool detach); + + int exitCode(); + + QString errorMessage() const; + QString exitStatusMessage() const; + + QProcess* releaseProcess(); + + static void killProcess(QProcess * p); + + // when true, kill any running script ASAP + static bool kill_script; - // 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(); + + /// returns false if we killed the process + /// actually returns Systemcall::ReturnValue + bool waitAndCheck(); +}; } // namespace support } // namespace lyx -#endif // LYX_SUPPORT_SYSTEMCALLPRIVATE_H +#endif // SYSTEMCALLPRIVATE_H