aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Fabio Bas2008-05-07 22:25:58 +0000
committerGravatar Fabio Bas2008-05-07 22:25:58 +0000
commite27d2496d83a05a8304905aa67ef2aa636a06bd5 (patch)
treee38adfa40744203abeca0577768b70c377bb9fd9
parentfix compilation error (diff)
downloadKVIrc-e27d2496d83a05a8304905aa67ef2aa636a06bd5.tar.gz
KVIrc-e27d2496d83a05a8304905aa67ef2aa636a06bd5.tar.bz2
KVIrc-e27d2496d83a05a8304905aa67ef2aa636a06bd5.zip
finished porting kviprocess (adapted kviprocessmanager, aka /exec)
git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@1706 17fca916-40b9-46aa-a4ea-0a15b648b75c
-rw-r--r--src/kvirc/kvs/kvi_kvs_corecallbackcommands.cpp4
-rw-r--r--src/kvirc/kvs/kvi_kvs_processmanager.cpp74
-rw-r--r--src/kvirc/kvs/kvi_kvs_processmanager.h1
3 files changed, 44 insertions, 35 deletions
diff --git a/src/kvirc/kvs/kvi_kvs_corecallbackcommands.cpp b/src/kvirc/kvs/kvi_kvs_corecallbackcommands.cpp
index 769415112..0375f7344 100644
--- a/src/kvirc/kvs/kvi_kvs_corecallbackcommands.cpp
+++ b/src/kvirc/kvs/kvi_kvs_corecallbackcommands.cpp
@@ -722,9 +722,9 @@ namespace KviKvsCoreCallbackCommands
[comment]# Do it another way: enable stderr and filter out stdout[/comment]
exec -e ("sed -senseless"){ if($0 == "stderr")echo $1; }
[comment]# Now enable all (almost) events and print them[/comment]
- exec -e -t -s ("cat /proc/cpuinfo && sed -senseless"){ echo [event:$0] $1; }
+ exec -e -t -x ("cat /proc/cpuinfo && sed -senseless"){ echo [event:$0] $1; }
[comment]# Now see what happens if -b is used[/comment]
- exec -b -e -t -s ("cat /proc/cpuinfo && sed -senseless"){ echo [event:$0] $1; }
+ exec -b -e -t -x ("cat /proc/cpuinfo && sed -senseless"){ echo [event:$0] $1; }
[comment]# Run an iterative script and kill it after 20 seconds[/comment]
exec -k=20000 ("while true; do sleep 1; echo \"Tic\"; done"){ echo [event:$0] $1; }
[comment]# Run a blocking process, kill it after 20 seconds[/comment]
diff --git a/src/kvirc/kvs/kvi_kvs_processmanager.cpp b/src/kvirc/kvs/kvi_kvs_processmanager.cpp
index 36d6ca777..f12e75c2b 100644
--- a/src/kvirc/kvs/kvi_kvs_processmanager.cpp
+++ b/src/kvirc/kvs/kvi_kvs_processmanager.cpp
@@ -64,7 +64,8 @@ KviKvsProcessAsyncOperation::~KviKvsProcessAsyncOperation()
bool KviKvsProcessAsyncOperation::start()
{
QStringList args;
-
+ QString szcmd;
+
if(m_pData->iFlags & KVI_KVS_PROCESSDESCRIPTOR_NOSHELL)
{
args = QStringList::split(" ",m_pData->szCommandline);
@@ -89,41 +90,37 @@ bool KviKvsProcessAsyncOperation::start()
args = QStringList::split(" ",szShell);
args.append(m_pData->szCommandline);
}
-
- m_pProcess = new KviProcess();
-
+
+ m_pProcess = new KviProcess(this);
+
if(m_pData->iFlags & KVI_KVS_PROCESSDESCRIPTOR_TRIGGERSTDOUT)
{
connect(m_pProcess,SIGNAL(readyReadStandardOutput()),this,SLOT(readStdout()));
} else {
m_pProcess->closeReadChannel(KviProcess::StandardOutput);
}
-
+
if(m_pData->iFlags & KVI_KVS_PROCESSDESCRIPTOR_TRIGGERSTDERR)
{
connect(m_pProcess,SIGNAL(readyReadStandardError()),this,SLOT(readStderr()));
} else {
m_pProcess->closeReadChannel(KviProcess::StandardError);
}
-
+
connect(m_pProcess,SIGNAL(finished(int)),this,SLOT(processExited(int)));
-
- m_pProcess->start(args.join(QString(' ')));
- if(m_pProcess->state()==KviProcess::NotRunning)
+ if(m_pData->iFlags & KVI_KVS_PROCESSDESCRIPTOR_TRIGGERSTARTED)
{
- return false;
+ qDebug("CONNESSO STARTED\n");
+ connect(m_pProcess,SIGNAL(started()),this,SLOT(processStarted()));
}
- if(m_pData->iFlags & KVI_KVS_PROCESSDESCRIPTOR_TRIGGERSTARTED)
+ szcmd = args.takeFirst();
+ m_pProcess->start(szcmd, args);
+
+ if(m_pProcess->state()==KviProcess::NotRunning)
{
- QString szPid;
- szPid.setNum((int)(m_pProcess->pid()));
- if(trigger(EventStarted,szPid))
- {
- triggerSelfDelete();
- return true;
- }
+ return false;
}
if(m_pData->iMaxRunTime > 0)
@@ -132,14 +129,14 @@ bool KviKvsProcessAsyncOperation::start()
connect(m_pRunTimeTimer,SIGNAL(timeout()),this,SLOT(maxRunTimeExpired()));
m_pRunTimeTimer->start(m_pData->iMaxRunTime);
}
-
+
if(m_pData->iPingTimeout > 0)
{
m_pPingTimer = new QTimer(this);
connect(m_pPingTimer,SIGNAL(timeout()),this,SLOT(ping()));
m_pPingTimer->start(m_pData->iPingTimeout);
}
-
+
return true;
}
@@ -172,7 +169,7 @@ void KviKvsProcessAsyncOperation::maxRunTimeExpired()
bool KviKvsProcessAsyncOperation::trigger(CallbackEvent e,const QString &szData)
{
if(m_bDeletePending)return false;
-
+
if(!g_pApp->windowExists(m_pData->pWnd))
{
if(m_pData->iFlags & KVI_KVS_PROCESSDESCRIPTOR_KILLIFNOWINDOW)
@@ -186,7 +183,7 @@ bool KviKvsProcessAsyncOperation::trigger(CallbackEvent e,const QString &szData)
{
KviKvsVariantList params;
params.setAutoDelete(true);
-
+
switch(e)
{
case EventStdout:
@@ -228,7 +225,7 @@ bool KviKvsProcessAsyncOperation::trigger(CallbackEvent e,const QString &szData)
retVal.asString(sz);
m_pProcess->write(sz.toAscii());
}
-
+
if(iRet & KviKvsScript::HaltEncountered)
{
// halt encountered: kill the process
@@ -251,8 +248,9 @@ void KviKvsProcessAsyncOperation::readStdout()
m_pProcess->setReadChannel(KviProcess::StandardOutput);
QString l = m_pProcess->readLine();
bool bBreak = false;
- while((!l.isNull()) && (!bBreak))
+ while((m_pProcess->canReadLine()) && (!bBreak))
{
+ l = m_pProcess->readLine();
if(m_pData->iFlags & KVI_KVS_PROCESSDESCRIPTOR_TRIGGERSTDOUT)
{
if(trigger(EventStdout,l))
@@ -261,8 +259,6 @@ void KviKvsProcessAsyncOperation::readStdout()
triggerSelfDelete();
}
}
-
- l = m_pProcess->readLine();
}
}
}
@@ -277,10 +273,12 @@ void KviKvsProcessAsyncOperation::readStderr()
m_szStderrBuffer += QString(a);
} else {
m_pProcess->setReadChannel(KviProcess::StandardError);
- QString l = m_pProcess->readLine();
+ QString l;
bool bBreak = false;
- while((!l.isNull()) && (!bBreak))
+ while((m_pProcess->canReadLine()) && (!bBreak))
{
+ l = m_pProcess->readLine();
+
if(m_pData->iFlags & KVI_KVS_PROCESSDESCRIPTOR_TRIGGERSTDERR)
{
if(trigger(EventStderr,l))
@@ -289,12 +287,22 @@ void KviKvsProcessAsyncOperation::readStderr()
triggerSelfDelete();
}
}
-
- l = m_pProcess->readLine();
}
}
}
+void KviKvsProcessAsyncOperation::processStarted()
+{
+ if(m_bDeletePending)return;
+
+ QString szPid;
+ szPid.setNum((int)(m_pProcess->pid()));
+ if(trigger(EventStarted,szPid))
+ {
+ triggerSelfDelete();
+ return;
+ }
+}
void KviKvsProcessAsyncOperation::processExited(int exitCode)
{
@@ -302,7 +310,7 @@ void KviKvsProcessAsyncOperation::processExited(int exitCode)
readStdout(); // just to make sure
readStderr(); // just to make sure
-
+
if(m_pData->iFlags & KVI_KVS_PROCESSDESCRIPTOR_OUTPUTBYBLOCKS)
{
// trigger Stdout and Stderr once
@@ -314,7 +322,7 @@ void KviKvsProcessAsyncOperation::processExited(int exitCode)
return;
}
}
-
+
if(m_pData->iFlags & KVI_KVS_PROCESSDESCRIPTOR_TRIGGERSTDERR)
{
if(trigger(EventStdout,m_szStderrBuffer))
@@ -331,7 +339,7 @@ void KviKvsProcessAsyncOperation::processExited(int exitCode)
szRetVal.setNum(exitCode);
trigger(EventTerminated,szRetVal);
}
-
+
triggerSelfDelete();
}
diff --git a/src/kvirc/kvs/kvi_kvs_processmanager.h b/src/kvirc/kvs/kvi_kvs_processmanager.h
index 270228af6..60ca75f94 100644
--- a/src/kvirc/kvs/kvi_kvs_processmanager.h
+++ b/src/kvirc/kvs/kvi_kvs_processmanager.h
@@ -95,6 +95,7 @@ private slots:
void readStdout();
void readStderr();
void processExited(int exitCode);
+ void processStarted();
void selfDelete();
private:
bool trigger(CallbackEvent e,const QString &szData);