summaryrefslogtreecommitdiffstats
path: root/lib/util/blockingtdeprocess.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/util/blockingtdeprocess.h')
-rw-r--r--lib/util/blockingtdeprocess.h93
1 files changed, 93 insertions, 0 deletions
diff --git a/lib/util/blockingtdeprocess.h b/lib/util/blockingtdeprocess.h
new file mode 100644
index 00000000..2252f59f
--- /dev/null
+++ b/lib/util/blockingtdeprocess.h
@@ -0,0 +1,93 @@
+
+/***************************************************************************
+* Copyright (C) 2006 by Andras Mantia *
+* amantia@kde.org *
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation; either version 2 of the License, or *
+* (at your option) any later version. *
+* *
+***************************************************************************/
+
+
+#ifndef BLOCKINGTDEPROCESS_H
+#define BLOCKINGTDEPROCESS_H
+
+#include <tdeprocess.h>
+
+/**
+ * Blocking version of TDEProcess, which stores the stdout.
+ * Differences between start(TDEProcess::Block, TDEProcess::StdOut) and this
+ * class are:
+ * - the GUI update is not blocked why the external process is running
+ * - in case of problems there is a timeout (defaults to 60 seconds), after which the
+ * process is terminated.
+ * - the stdout is caught - it the caller request it - and can be read by the caller
+ * @author Andras Mantia <amantia@kde.org>
+*/
+
+class TQTimer;
+class BlockingTDEProcess : public TDEProcess
+{
+ TQ_OBJECT
+
+
+public:
+ BlockingTDEProcess(TQObject *parent, const char *name=0);
+ BlockingTDEProcess();
+
+ virtual ~BlockingTDEProcess();
+
+ /**
+ * Start the process. It waits until the process exits or the timeout is hit.
+ * @param runmode @see TDEProcess, use TDEProcess::NotifyOnExit to get proper behaviour,
+ * not TDEProcess::Block
+ * @param comm if Stdout is passed, it catches the output. For the rest @see TDEProcess
+ * @return true in case of success, false if there are problems to start the process
+ * or it was killed because of the timeout.
+ */
+ virtual bool start(RunMode runmode=NotifyOnExit, Communication comm=NoCommunication);
+
+ /**
+ * Get the output of the run process
+ * @return the output
+ */
+ TQString stdOut() { return m_stdOut;}
+ /**
+ * Clear the internal stdout buffer. Useful in case the class is reused.
+ */
+ void clearStdOut() { m_stdOut = "";}
+ /**
+ * Get the error output of the run process
+ * @return the output
+ */
+ TQString stdErr() { return m_stdErr;}
+ /**
+ * Clear the internal stderr buffer. Useful in case the class is reused.
+ */
+ void clearStdErr() { m_stdErr = "";}
+
+ /**
+ * Sets the timeout
+ * @param timeout seconds after which the process is considered hung and killed. 0 disables the timeout.
+ */
+ void setTimeOut(int timeout) { m_timeoutValue = timeout; }
+
+private slots:
+ void slotReceivedStdOut(TDEProcess *proc, char *buffer, int buflen);
+ void slotReceivedStdErr(TDEProcess *proc, char *buffer, int buflen);
+ void slotProcessExited(TDEProcess *proc);
+ void slotTimeOut();
+
+private:
+ void enter_loop();
+
+ TQString m_stdOut;
+ TQString m_stdErr;
+ bool m_timeout;
+ int m_timeoutValue;
+ TQTimer *m_timer;
+};
+
+#endif