summaryrefslogtreecommitdiffstats
path: root/kommander/widget/myprocess.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kommander/widget/myprocess.cpp')
-rw-r--r--kommander/widget/myprocess.cpp137
1 files changed, 137 insertions, 0 deletions
diff --git a/kommander/widget/myprocess.cpp b/kommander/widget/myprocess.cpp
new file mode 100644
index 00000000..e7e05e3b
--- /dev/null
+++ b/kommander/widget/myprocess.cpp
@@ -0,0 +1,137 @@
+/***************************************************************************
+ myprocess.cpp - Wrapper class for running shell processes
+ -------------------
+ copyright : (C) 2002 by Marc Britton
+ email : consume@optusnet.com.au
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+/* KDE INCLUDES */
+#include <klocale.h>
+#include <kprocess.h>
+#include <klocale.h>
+
+/* QT INCLUDES */
+#include <qapplication.h>
+#include <qobject.h>
+#include <qstring.h>
+
+/* OTHER INCLUDES */
+#include "myprocess.h"
+#include "kommanderwidget.h"
+
+MyProcess::MyProcess(const KommanderWidget *a_atw)
+ : m_atw(a_atw), m_loopStarted(false), m_blocking(true), mProcess(0)
+{
+}
+
+void qt_enter_modal(QWidget *widget);
+void qt_leave_modal(QWidget *widget);
+
+void MyProcess::setBlocking(bool blocking)
+{
+ m_blocking = blocking;
+}
+
+QString MyProcess::output() const
+{
+ return m_output;
+}
+
+bool MyProcess::isBlocking() const
+{
+ return m_blocking;
+}
+
+
+void MyProcess::cancel()
+{
+ if (mProcess) {
+ delete mProcess;
+ mProcess = 0;
+ }
+}
+
+QString MyProcess::run(const QString& a_command, const QString& a_shell)
+{
+ QString at = a_command.stripWhiteSpace();
+ if (at.isEmpty())
+ {
+ emit processExited(0);
+ return QString();
+ }
+
+ QString shellName = a_shell;
+ if (shellName.isEmpty())
+ shellName = "/bin/sh";
+
+ // Look for shell
+ if (at.startsWith("#!")) {
+ int eol = at.find("\n");
+ if (eol == -1)
+ eol = at.length();
+ shellName = at.mid(2, eol-1).stripWhiteSpace();
+ at = at.mid(eol+1);
+ }
+ m_input = at.local8Bit();
+
+ mProcess = new KProcess;
+ (*mProcess) << shellName.latin1();
+
+ connect(mProcess, SIGNAL(receivedStdout(KProcess*, char*, int)),
+ SLOT(slotReceivedStdout(KProcess*, char*, int)));
+ connect(mProcess, SIGNAL(processExited(KProcess*)), SLOT(slotProcessExited(KProcess*)));
+
+ if(!mProcess->start(KProcess::NotifyOnExit, KProcess::All))
+ {
+ m_atw->printError(i18n("<qt>Failed to start shell process<br><b>%1</b></qt>").arg(shellName));
+ return QString();
+ }
+ mProcess->writeStdin(m_input, m_input.length());
+ mProcess->closeStdin();
+
+ if (!m_blocking)
+ return QString();
+ else
+ {
+ QWidget dummy(0, 0, WType_Dialog | WShowModal);
+ dummy.setFocusPolicy(QWidget::NoFocus);
+ m_loopStarted = true;
+ qt_enter_modal(&dummy);
+ qApp->enter_loop();
+ qt_leave_modal(&dummy);
+
+ if (!m_output.isEmpty() && m_output[m_output.length()-1] == '\n')
+ return m_output.left(m_output.length()-1);
+ else
+ return m_output;
+ }
+}
+
+void MyProcess::slotReceivedStdout(KProcess*, char* a_buffer, int a_len)
+{
+ m_output += QString::fromLocal8Bit(a_buffer, a_len);
+ emit processReceivedStdout(this, a_buffer, a_len);
+}
+
+void MyProcess::slotProcessExited(KProcess* process)
+{
+ if (m_loopStarted)
+ {
+ qApp->exit_loop();
+ m_loopStarted = false;
+ }
+ delete process;
+ if (!m_blocking)
+ emit processExited(this);
+ mProcess = 0;
+}
+
+#include "myprocess.moc"