You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
k3b/libk3b/core/k3bprocess.h

207 lines
4.7 KiB

/*
*
* $Id: k3bprocess.h 621644 2007-01-09 12:53:09Z trueg $
* Copyright (C) 2003 Sebastian Trueg <trueg@k3b.org>
*
* This file is part of the K3b project.
* Copyright (C) 1998-2007 Sebastian Trueg <trueg@k3b.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* See the file "COPYING" for the exact licensing terms.
*/
#ifndef K3B_PROCESS_H
#define K3B_PROCESS_H
#include <kprocess.h>
#include <tqstring.h>
#include "k3b_export.h"
class K3bExternalBin;
/**
* This is an enhanced TDEProcess.
* It splits the stderr output to lines making sure the client gets every line as it
* was written by the process.
* Aditionally one may set raw stdout and stdin handling using the stdin() and stdout() methods
* to get the process' file descriptors.
* Last but not least K3bProcess is able to duplicate stdout making it possible to connect two
* K3bProcesses like used in K3bDataJob to duplicate mkisofs' stdout to the stdin of the writer
* (cdrecord or cdrdao)
*/
class LIBK3B_EXPORT K3bProcess : public TDEProcess
{
Q_OBJECT
public:
class OutputCollector;
public:
K3bProcess();
~K3bProcess();
/**
* In the future this might also set the nice value
*/
K3bProcess& operator<<( const K3bExternalBin* );
K3bProcess& operator<<( const TQString& arg );
K3bProcess& operator<<( const char* arg );
K3bProcess& operator<<( const TQCString& arg );
K3bProcess& operator<<( const TQStringList& args );
bool start( RunMode run = NotifyOnExit, Communication com = NoCommunication );
/**
* get stdin file descriptor
* Only makes sense while process is running.
*
* Only use with setRawStdin
*/
int stdinFd() const;
/**
* get stdout file descriptor
* Only makes sense while process is running.
*
* Only use with setRawStdout
*/
int stdoutFd() const;
/**
* @deprecated use writeToFd
*/
void dupStdout( int fd );
/**
* @deprecated use readFromFd
*/
void dupStdin( int fd );
/**
* Make the process write to @fd instead of Stdout.
* This means you won't get any stdoutReady() or receivedStdout()
* signals anymore.
*
* Only use this before starting the process.
*/
void writeToFd( int fd );
/**
* Make the process read from @fd instead of Stdin.
* This means you won't get any wroteStdin()
* signals anymore.
*
* Only use this before starting the process.
*/
void readFromFd( int fd );
/**
* If set true the process' stdin fd will be available
* through @stdinFd.
* Be aware that you will not get any wroteStdin signals
* anymore.
*
* Only use this before starting the process.
*/
void setRawStdin(bool b);
/**
* If set true the process' stdout fd will be available
* through @stdoutFd.
* Be aware that you will not get any stdoutReady or receivedStdout
* signals anymore.
*
* Only use this before starting the process.
*/
void setRawStdout(bool b);
public slots:
void setSplitStdout( bool b ) { m_bSplitStdout = b; }
/**
* default is true
*/
void setSuppressEmptyLines( bool b );
bool closeStdin();
bool closeStdout();
private slots:
void slotSplitStderr( TDEProcess*, char*, int );
void slotSplitStdout( TDEProcess*, char*, int );
signals:
void stderrLine( const TQString& line );
void stdoutLine( const TQString& line );
/**
* Gets emitted if raw stdout mode has been requested
* The data has to be read from @p fd.
*/
void stdoutReady( int fd );
protected:
/**
* reimplemeted from TDEProcess
*/
int commSetupDoneP();
/**
* reimplemeted from TDEProcess
*/
int commSetupDoneC();
/**
* reimplemeted from TDEProcess
*/
int setupCommunication( Communication comm );
/**
* reimplemeted from TDEProcess
*/
void commClose();
private:
static TQStringList splitOutput( char*, int, TQString&, bool );
class Data;
Data* d;
bool m_bSplitStdout;
};
class LIBK3B_EXPORT K3bProcessOutputCollector: public TQObject
{
Q_OBJECT
public:
K3bProcessOutputCollector( TDEProcess* );
void setProcess( TDEProcess* );
const TQString& output() const { return m_gatheredOutput; }
const TQString& stderrOutput() const { return m_stderrOutput; }
const TQString& stdoutOutput() const { return m_stdoutOutput; }
private slots:
void slotGatherStderr( TDEProcess*, char*, int );
void slotGatherStdout( TDEProcess*, char*, int );
private:
TQString m_gatheredOutput;
TQString m_stderrOutput;
TQString m_stdoutOutput;
TDEProcess* m_process;
};
#endif