/* This file is part of the KDE project Copyright (C) 2000 Alexander Neundorf This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "kshellcmdexecutor.h" #include #include #include #include #include #include #include #include #include #include KShellCommandExecutor::KShellCommandExecutor(const TQString& command, TQWidget* parent) :TQTextView(parent) ,m_shellProcess(0) ,m_command(command) ,m_readNotifier(0) ,m_writeNotifier(0) { setTextFormat(PlainText); setFont( TDEGlobalSettings::fixedFont() ); } KShellCommandExecutor::~KShellCommandExecutor() { if (m_shellProcess!=0) { ::kill(m_shellProcess->pid()+1, SIGTERM); delete m_shellProcess; }; } int KShellCommandExecutor::exec() { //kdDebug()<<"---------- KShellCommandExecutor::exec()"<pid(),SIGTERM); delete m_shellProcess; }; if (m_readNotifier!=0) delete m_readNotifier; if (m_writeNotifier!=0) delete m_writeNotifier; m_shellProcess=new PtyProcess(); m_shellProcess->setTerminal(true); QCStringList args; args+="-c"; args+=m_command.local8Bit(); //kdDebug()<<"------- executing: "<exec(shell, args); if (ret < 0) { //kdDebug()<<"could not execute"<fd(),TQSocketNotifier::Read, TQT_TQOBJECT(this)); m_writeNotifier=new TQSocketNotifier(m_shellProcess->fd(),TQSocketNotifier::Write, TQT_TQOBJECT(this)); m_writeNotifier->setEnabled(false); connect (m_readNotifier, TQT_SIGNAL(activated(int)), TQT_TQOBJECT(this),TQT_SLOT(readDataFromShell())); connect (m_writeNotifier, TQT_SIGNAL(activated(int)), TQT_TQOBJECT(this),TQT_SLOT(writeDataToShell())); return 1; } void KShellCommandExecutor::readDataFromShell() { //kdDebug()<<"--------- reading ------------"<fd(), buffer, 16*1024-1); //0-terminate the buffer //process exited if (bytesRead<=0) { slotFinished(); } else if (bytesRead>0) { //kdDebug()<<"***********************\n"<append(TQString::fromLocal8Bit(buffer)); setTextFormat(PlainText); }; } void KShellCommandExecutor::writeDataToShell() { //kdDebug()<<"--------- writing ------------"<fd(),input,input.length()); ::write(m_shellProcess->fd(),"\n",1); } else slotFinished(); if (m_writeNotifier) { m_writeNotifier->setEnabled(false); } } void KShellCommandExecutor::slotFinished() { setTextFormat(PlainText); if (m_shellProcess!=0) { delete m_readNotifier; m_readNotifier = 0; delete m_writeNotifier; m_writeNotifier = 0; //kdDebug()<<"slotFinished: pid: "<pid()<pid()+1, SIGTERM); ::kill(m_shellProcess->pid(), SIGTERM); }; delete m_shellProcess; m_shellProcess=0; emit finished(); } #include "kshellcmdexecutor.moc"