diff options
| author | 2008-05-07 22:25:58 +0000 | |
|---|---|---|
| committer | 2008-05-07 22:25:58 +0000 | |
| commit | e27d2496d83a05a8304905aa67ef2aa636a06bd5 (patch) | |
| tree | e38adfa40744203abeca0577768b70c377bb9fd9 /src | |
| parent | fix compilation error (diff) | |
| download | KVIrc-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
Diffstat (limited to 'src')
| -rw-r--r-- | src/kvirc/kvs/kvi_kvs_corecallbackcommands.cpp | 4 | ||||
| -rw-r--r-- | src/kvirc/kvs/kvi_kvs_processmanager.cpp | 74 | ||||
| -rw-r--r-- | src/kvirc/kvs/kvi_kvs_processmanager.h | 1 |
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); |
