You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdewebdev/kommander/widget/myprocess.cpp

138 lines
3.6 KiB

/***************************************************************************
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 <tqapplication.h>
#include <tqobject.h>
#include <tqstring.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(TQWidget *widget);
void qt_leave_modal(TQWidget *widget);
void MyProcess::setBlocking(bool blocking)
{
m_blocking = blocking;
}
TQString MyProcess::output() const
{
return m_output;
}
bool MyProcess::isBlocking() const
{
return m_blocking;
}
void MyProcess::cancel()
{
if (mProcess) {
delete mProcess;
mProcess = 0;
}
}
TQString MyProcess::run(const TQString& a_command, const TQString& a_shell)
{
TQString at = a_command.stripWhiteSpace();
if (at.isEmpty())
{
emit processExited(0);
return TQString();
}
TQString 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, TQT_SIGNAL(receivedStdout(KProcess*, char*, int)),
TQT_SLOT(slotReceivedStdout(KProcess*, char*, int)));
connect(mProcess, TQT_SIGNAL(processExited(KProcess*)), TQT_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 TQString();
}
mProcess->writeStdin(m_input, m_input.length());
mProcess->closeStdin();
if (!m_blocking)
return TQString();
else
{
TQWidget dummy(0, 0, WType_Dialog | WShowModal);
dummy.setFocusPolicy(TQWidget::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 += TQString::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"