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"