home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / src / common / process.cpp < prev    next >
C/C++ Source or Header  |  2002-11-09  |  5KB  |  173 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name:        process.cpp
  3. // Purpose:     Process termination classes
  4. // Author:      Guilhem Lavaux
  5. // Modified by: Vadim Zeitlin to check error codes, added Detach() method
  6. // Created:     24/06/98
  7. // RCS-ID:      $Id: process.cpp,v 1.16.2.2 2002/11/04 21:33:20 VZ Exp $
  8. // Copyright:   (c) Guilhem Lavaux
  9. // Licence:     wxWindows license
  10. /////////////////////////////////////////////////////////////////////////////
  11.  
  12. // ============================================================================
  13. // declarations
  14. // ============================================================================
  15.  
  16. // ----------------------------------------------------------------------------
  17. // headers
  18. // ----------------------------------------------------------------------------
  19.  
  20. #ifdef __GNUG__
  21.     #pragma implementation "process.h"
  22. #endif
  23.  
  24. // For compilers that support precompilation, includes "wx.h".
  25. #include "wx/wxprec.h"
  26.  
  27. #ifdef __BORLANDC__
  28.     #pragma hdrstop
  29. #endif
  30.  
  31. #include "wx/process.h"
  32.  
  33. // ----------------------------------------------------------------------------
  34. // event tables and such
  35. // ----------------------------------------------------------------------------
  36.  
  37. DEFINE_EVENT_TYPE(wxEVT_END_PROCESS)
  38.  
  39. IMPLEMENT_DYNAMIC_CLASS(wxProcess, wxEvtHandler)
  40. IMPLEMENT_DYNAMIC_CLASS(wxProcessEvent, wxEvent)
  41.  
  42. // ============================================================================
  43. // wxProcess implementation
  44. // ============================================================================
  45.  
  46. // ----------------------------------------------------------------------------
  47. // wxProcess creation
  48. // ----------------------------------------------------------------------------
  49.  
  50. void wxProcess::Init(wxEvtHandler *parent, int id, int flags)
  51. {
  52.     if ( parent )
  53.         SetNextHandler(parent);
  54.  
  55.     m_id         = id;
  56.     m_redirect   = (flags & wxPROCESS_REDIRECT) != 0;
  57.  
  58. #if wxUSE_STREAMS
  59.     m_inputStream  = NULL;
  60.     m_errorStream  = NULL;
  61.     m_outputStream = NULL;
  62. #endif // wxUSE_STREAMS
  63. }
  64.  
  65. /* static */
  66. wxProcess *wxProcess::Open(const wxString& cmd, int flags)
  67. {
  68.     wxASSERT_MSG( !(flags & wxEXEC_SYNC), wxT("wxEXEC_SYNC should not be used." ));
  69.     wxProcess *process = new wxProcess(wxPROCESS_REDIRECT);
  70.     if ( !wxExecute(cmd, flags, process) )
  71.     {
  72.         // couldn't launch the process
  73.         delete process;
  74.         return NULL;
  75.     }
  76.  
  77.     return process;
  78. }
  79.  
  80. // ----------------------------------------------------------------------------
  81. // wxProcess termination
  82. // ----------------------------------------------------------------------------
  83.  
  84. wxProcess::~wxProcess()
  85. {
  86. #if wxUSE_STREAMS
  87.     delete m_inputStream;
  88.     delete m_errorStream;
  89.     delete m_outputStream;
  90. #endif // wxUSE_STREAMS
  91. }
  92.  
  93. void wxProcess::OnTerminate(int pid, int status)
  94. {
  95.     wxProcessEvent event(m_id, pid, status);
  96.  
  97.     if ( !ProcessEvent(event) )
  98.         delete this;
  99.     //else: the object which processed the event is responsible for deleting
  100.     //      us!
  101. }
  102.  
  103. void wxProcess::Detach()
  104. {
  105.     SetNextHandler(NULL);
  106. }
  107.  
  108. // ----------------------------------------------------------------------------
  109. // process IO redirection
  110. // ----------------------------------------------------------------------------
  111.  
  112. #if wxUSE_STREAMS
  113.  
  114. void wxProcess::SetPipeStreams(wxInputStream *inputSstream,
  115.                                wxOutputStream *outputStream,
  116.                                wxInputStream *errorStream)
  117. {
  118.     m_inputStream  = inputSstream;
  119.     m_errorStream  = errorStream;
  120.     m_outputStream = outputStream;
  121. }
  122.  
  123. bool wxProcess::IsInputOpened() const
  124. {
  125.     return m_inputStream && m_inputStream->GetLastError() != wxSTREAM_EOF;
  126. }
  127.  
  128. bool wxProcess::IsInputAvailable() const
  129. {
  130.     return m_inputStream && m_inputStream->CanRead();
  131. }
  132.  
  133. bool wxProcess::IsErrorAvailable() const
  134. {
  135.     return m_errorStream && m_errorStream->CanRead();
  136. }
  137.  
  138. #endif // wxUSE_STREAMS
  139.  
  140. // ----------------------------------------------------------------------------
  141. // process killing
  142. // ----------------------------------------------------------------------------
  143.  
  144. /* static */
  145. wxKillError wxProcess::Kill(int pid, wxSignal sig)
  146. {
  147.     wxKillError rc;
  148.     (void)wxKill(pid, sig, &rc);
  149.  
  150.     return rc;
  151. }
  152.  
  153. /* static */
  154. bool wxProcess::Exists(int pid)
  155. {
  156.     switch ( Kill(pid, wxSIGNONE) )
  157.     {
  158.         case wxKILL_OK:
  159.         case wxKILL_ACCESS_DENIED:
  160.             return TRUE;
  161.  
  162.         default:
  163.         case wxKILL_ERROR:
  164.         case wxKILL_BAD_SIGNAL:
  165.             wxFAIL_MSG( _T("unexpected wxProcess::Kill() return code") );
  166.             // fall through
  167.  
  168.         case wxKILL_NO_PROCESS:
  169.             return FALSE;
  170.     }
  171. }
  172.  
  173.