1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     wxProcess class 
   4 // Author:      Guilhem Lavaux 
   5 // Modified by: Vadim Zeitlin to check error codes, added Detach() method 
   8 // Copyright:   (c) 1998 Guilhem Lavaux 
   9 // Licence:     wxWindows license 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 #ifndef _WX_PROCESSH__ 
  13 #define _WX_PROCESSH__ 
  16     #pragma interface "process.h" 
  22     #include "wx/stream.h" 
  25 #include "wx/utils.h"       // for wxSignal 
  27 // the wxProcess creation flags 
  31     wxPROCESS_DEFAULT 
= 0, 
  33     // redirect the IO of the child process 
  34     wxPROCESS_REDIRECT 
= 1 
  37 // ---------------------------------------------------------------------------- 
  38 // A wxProcess object should be passed to wxExecute - than its OnTerminate() 
  39 // function will be called when the process terminates. 
  40 // ---------------------------------------------------------------------------- 
  42 class WXDLLEXPORT wxProcess 
: public wxEvtHandler
 
  45     // kill the process with the given PID 
  46     static wxKillError 
Kill(int pid
, wxSignal sig 
= wxSIGTERM
); 
  48     // test if the given process exists 
  49     static bool Exists(int pid
); 
  51     // this function replaces the standard popen() one: it launches a process 
  52     // asynchronously and allows the caller to get the streams connected to its 
  55     // on error NULL is returned, in any case the process object will be 
  56     // deleted automatically when the process terminates and should *not* be 
  57     // deleted by the caller 
  58     static wxProcess 
*Open(const wxString
& cmd
, int flags 
= wxEXEC_ASYNC
); 
  62     wxProcess(wxEvtHandler 
*parent 
= (wxEvtHandler 
*) NULL
, int id 
= -1) 
  63         { Init(parent
, id
, wxPROCESS_DEFAULT
); } 
  65     wxProcess(int flags
) { Init(NULL
, -1, flags
); } 
  69     // may be overridden to be notified about process termination 
  70     virtual void OnTerminate(int pid
, int status
); 
  72     // call this before passing the object to wxExecute() to redirect the 
  73     // launched process stdin/stdout, then use GetInputStream() and 
  74     // GetOutputStream() to get access to them 
  75     void Redirect() { m_redirect 
= TRUE
; } 
  76     bool IsRedirected() const { return m_redirect
; } 
  78     // detach from the parent - should be called by the parent if it's deleted 
  79     // before the process it started terminates 
  84     wxInputStream 
*GetInputStream() const { return m_inputStream
; } 
  85     wxInputStream 
*GetErrorStream() const { return m_errorStream
; } 
  86     wxOutputStream 
*GetOutputStream() const { return m_outputStream
; } 
  88     // close the output stream indicating that nothing more will be written 
  89     void CloseOutput() { delete m_outputStream
; m_outputStream 
= NULL
; } 
  91     // implementation only (for wxExecute) 
  93     // NB: the streams passed here should correspond to the child process 
  94     //     stdout, stdin and stderr and here the normal naming convention is 
  95     //     used unlike elsewhere in this class 
  96     void SetPipeStreams(wxInputStream 
*outStream
, 
  97                         wxOutputStream 
*inStream
, 
  98                         wxInputStream 
*errStream
); 
  99 #endif // wxUSE_STREAMS 
 101     // for backwards compatibility only, don't use 
 102 #if WXWIN_COMPATIBILITY_2_2 
 103     wxProcess(wxEvtHandler 
*parent
, bool redirect
) 
 104         { Init(parent
, -1, redirect 
? wxPROCESS_REDIRECT 
: wxPROCESS_DEFAULT
); } 
 105 #endif // WXWIN_COMPATIBILITY_2_2 
 108     void Init(wxEvtHandler 
*parent
, int id
, int flags
); 
 113     // these streams are connected to stdout, stderr and stdin of the child 
 114     // process respectively (yes, m_inputStream corresponds to stdout -- very 
 115     // confusing but too late to change now) 
 116     wxInputStream  
*m_inputStream
, 
 118     wxOutputStream 
*m_outputStream
; 
 119 #endif // wxUSE_STREAMS 
 123     DECLARE_DYNAMIC_CLASS(wxProcess
) 
 126 // ---------------------------------------------------------------------------- 
 128 // ---------------------------------------------------------------------------- 
 130 BEGIN_DECLARE_EVENT_TYPES() 
 131     DECLARE_EVENT_TYPE(wxEVT_END_PROCESS
, 440) 
 132 END_DECLARE_EVENT_TYPES() 
 134 class WXDLLEXPORT wxProcessEvent 
: public wxEvent
 
 137     wxProcessEvent(int id 
= 0, int pid 
= 0, int exitcode 
= 0) : wxEvent(id
) 
 139         m_eventType 
= wxEVT_END_PROCESS
; 
 141         m_exitcode 
= exitcode
; 
 145         // PID of process which terminated 
 146     int GetPid() { return m_pid
; } 
 149     int GetExitCode() { return m_exitcode
; } 
 151     // implement the base class pure virtual 
 152     virtual wxEvent 
*Clone() const { return new wxProcessEvent(*this); } 
 158     DECLARE_DYNAMIC_CLASS(wxProcessEvent
) 
 161 typedef void (wxEvtHandler::*wxProcessEventFunction
)(wxProcessEvent
&); 
 163 #define EVT_END_PROCESS(id, func) \ 
 164    DECLARE_EVENT_TABLE_ENTRY( \ 
 165            wxEVT_END_PROCESS, id, -1, \ 
 166            (wxObjectEventFunction) \ 
 168            (wxProcessEventFunction) & func, NULL),