00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "collectingprocess.h"
00034
00035 #include <qvaluelist.h>
00036
00037 #include <string.h>
00038
00039 using namespace KPIM;
00040
00041 struct CollectingProcess::Private {
00042 Private() : stdoutSize( 0 ), stderrSize( 0 )
00043 {}
00044
00045 uint stdoutSize;
00046 QValueList<QByteArray> stdoutBuffer;
00047 uint stderrSize;
00048 QValueList<QByteArray> stderrBuffer;
00049 };
00050
00051
00052 CollectingProcess::CollectingProcess( QObject * parent, const char * name )
00053 : KProcess( parent, name )
00054 {
00055 d = new Private();
00056 }
00057
00058 CollectingProcess::~CollectingProcess() {
00059 delete d; d = 0;
00060 }
00061
00062 bool CollectingProcess::start( RunMode runmode, Communication comm ) {
00063
00064 disconnect( this, SIGNAL( receivedStdout( KProcess *, char *, int ) ),
00065 this, SLOT( slotReceivedStdout( KProcess *, char *, int ) ) );
00066 if ( comm & Stdout ) {
00067 connect( this, SIGNAL( receivedStdout( KProcess *, char *, int ) ),
00068 this, SLOT( slotReceivedStdout( KProcess *, char *, int ) ) );
00069 }
00070
00071 disconnect( this, SIGNAL( receivedStderr( KProcess *, char *, int ) ),
00072 this, SLOT( slotReceivedStderr( KProcess *, char *, int ) ) );
00073 if ( comm & Stderr ) {
00074 connect( this, SIGNAL( receivedStderr( KProcess *, char *, int ) ),
00075 this, SLOT( slotReceivedStderr( KProcess *, char *, int ) ) );
00076 }
00077 return KProcess::start( runmode, comm );
00078 }
00079
00080 void CollectingProcess::slotReceivedStdout( KProcess *, char *buf, int len )
00081 {
00082 QByteArray b;
00083 b.duplicate( buf, len );
00084 d->stdoutBuffer.append( b );
00085 d->stdoutSize += len;
00086 }
00087
00088 void CollectingProcess::slotReceivedStderr( KProcess *, char *buf, int len )
00089 {
00090 QByteArray b;
00091 b.duplicate( buf, len );
00092 d->stderrBuffer.append( b );
00093 d->stderrSize += len;
00094 }
00095
00096 QByteArray CollectingProcess::collectedStdout()
00097 {
00098 if ( d->stdoutSize == 0 ) {
00099 return QByteArray();
00100 }
00101
00102 uint offset = 0;
00103 QByteArray b( d->stdoutSize );
00104 for ( QValueList<QByteArray>::const_iterator it = d->stdoutBuffer.begin();
00105 it != d->stdoutBuffer.end();
00106 ++it ) {
00107 memcpy( b.data() + offset, (*it).data(), (*it).size() );
00108 offset += (*it).size();
00109 }
00110 d->stdoutBuffer.clear();
00111 d->stdoutSize = 0;
00112
00113 return b;
00114 }
00115
00116 QByteArray CollectingProcess::collectedStderr()
00117 {
00118 if ( d->stderrSize == 0 ) {
00119 return QByteArray();
00120 }
00121
00122 uint offset = 0;
00123 QByteArray b( d->stderrSize );
00124 for ( QValueList<QByteArray>::const_iterator it = d->stderrBuffer.begin();
00125 it != d->stderrBuffer.end();
00126 ++it ) {
00127 memcpy( b.data() + offset, (*it).data(), (*it).size() );
00128 offset += (*it).size();
00129 }
00130 d->stderrBuffer.clear();
00131 d->stderrSize = 0;
00132
00133 return b;
00134 }
00135
00136 void CollectingProcess::virtual_hook( int id, void * data ) {
00137 KProcess::virtual_hook( id, data );
00138 }
00139
00140 #include "collectingprocess.moc"