1. wxProcess changes to make capturing subprocess output easier (and more
reliable), now works in both sync and async modes 2. wxSafeYieldBug() corrected, wxWindowDisabler which is now used in it added and documented 3. exec sample updated to illustrate capturing the subprocess output 4. wxStreamBase::IsOk() added 5. wxInputStream::Eof() added and non-blocking Eof() implementation in wxPipeInputStream used by wxExecute git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6400 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -52,30 +52,42 @@ class WXDLLEXPORT wxProcess : public wxEvtHandler
|
||||
DECLARE_DYNAMIC_CLASS(wxProcess)
|
||||
|
||||
public:
|
||||
wxProcess(wxEvtHandler *parent = (wxEvtHandler *) NULL, bool needPipe = FALSE, int id = -1);
|
||||
~wxProcess();
|
||||
wxProcess(wxEvtHandler *parent = (wxEvtHandler *) NULL, int id = -1)
|
||||
{ Init(parent, id, FALSE); }
|
||||
wxProcess(wxEvtHandler *parent, bool redirect)
|
||||
{ Init(parent, -1, redirect); }
|
||||
|
||||
virtual ~wxProcess();
|
||||
|
||||
// may be overridden to be notified about process termination
|
||||
virtual void OnTerminate(int pid, int status);
|
||||
|
||||
// call this before passing the object to wxExecute() to redirect the
|
||||
// launched process stdin/stdout, then use GetInputStream() and
|
||||
// GetOutputStream() to get access to them
|
||||
void Redirect() { m_redirect = TRUE; }
|
||||
bool IsRedirected() const { return m_redirect; }
|
||||
|
||||
// detach from the parent - should be called by the parent if it's deleted
|
||||
// before the process it started terminates
|
||||
void Detach();
|
||||
|
||||
// Pipe handling
|
||||
wxInputStream *GetInputStream() const;
|
||||
wxOutputStream *GetOutputStream() const;
|
||||
wxInputStream *GetInputStream() const { return m_inputStream; }
|
||||
wxOutputStream *GetOutputStream() const { return m_outputStream; }
|
||||
|
||||
// These functions should not be called by the usual user. They are only
|
||||
// intended to be used by wxExecute.
|
||||
// Install pipes
|
||||
void SetPipeStreams(wxInputStream *in_stream, wxOutputStream *out_stream);
|
||||
bool NeedPipe() const;
|
||||
// implementation only (for wxExecute)
|
||||
void SetPipeStreams(wxInputStream *inStream, wxOutputStream *outStream);
|
||||
|
||||
protected:
|
||||
void Init(wxEvtHandler *parent, int id, bool redirect);
|
||||
|
||||
int m_id;
|
||||
bool m_needPipe;
|
||||
wxInputStream *m_in_stream;
|
||||
wxOutputStream *m_out_stream;
|
||||
|
||||
wxInputStream *m_inputStream;
|
||||
wxOutputStream *m_outputStream;
|
||||
|
||||
bool m_redirect;
|
||||
};
|
||||
|
||||
typedef void (wxObject::*wxProcessEventFunction)(wxProcessEvent&);
|
||||
|
@@ -38,12 +38,8 @@ WXDLLEXPORT wxOutputStream& wxEndL(wxOutputStream& o_stream);
|
||||
// wxStream: base classes
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
#define wxStream_NOERROR wxSTREAM_NOERROR
|
||||
#define wxStream_EOF wxSTREAM_EOF
|
||||
#define wxStream_WRITE_ERR wxSTREAM_WRITE_ERROR
|
||||
#define wxStream_READ_ERR wxSTREAM_READ_ERROR
|
||||
|
||||
typedef enum {
|
||||
typedef enum
|
||||
{
|
||||
wxSTREAM_NO_ERROR = 0,
|
||||
wxSTREAM_NO_ERR = wxSTREAM_NO_ERROR,
|
||||
wxSTREAM_NOERROR = wxSTREAM_NO_ERROR,
|
||||
@@ -58,14 +54,24 @@ typedef enum {
|
||||
|
||||
} wxStreamError;
|
||||
|
||||
// compatibility
|
||||
#define wxStream_NOERROR wxSTREAM_NOERROR
|
||||
#define wxStream_EOF wxSTREAM_EOF
|
||||
#define wxStream_WRITE_ERR wxSTREAM_WRITE_ERROR
|
||||
#define wxStream_READ_ERR wxSTREAM_READ_ERROR
|
||||
|
||||
class WXDLLEXPORT wxStreamBase
|
||||
{
|
||||
public:
|
||||
wxStreamBase();
|
||||
virtual ~wxStreamBase();
|
||||
|
||||
bool operator!() const { return (LastError() != wxSTREAM_NOERROR); }
|
||||
// error testing
|
||||
wxStreamError LastError() const { return m_lasterror; }
|
||||
wxStreamError GetLastError() const { return m_lasterror; }
|
||||
bool IsOk() const { return LastError() == wxSTREAM_NOERROR; }
|
||||
bool operator!() const { return LastError() != wxSTREAM_NOERROR; }
|
||||
|
||||
virtual size_t GetSize() const { return ~((size_t)0); }
|
||||
size_t StreamSize() const { return GetSize(); }
|
||||
|
||||
@@ -87,6 +93,9 @@ public:
|
||||
wxInputStream();
|
||||
virtual ~wxInputStream();
|
||||
|
||||
// is the stream at EOF?
|
||||
virtual bool Eof() const;
|
||||
|
||||
// IO functions
|
||||
virtual char Peek();
|
||||
char GetC();
|
||||
|
@@ -39,6 +39,7 @@
|
||||
class WXDLLEXPORT wxProcess;
|
||||
class WXDLLEXPORT wxFrame;
|
||||
class WXDLLEXPORT wxWindow;
|
||||
class WXDLLEXPORT wxWindowList;
|
||||
|
||||
// FIXME should use wxStricmp() instead
|
||||
#if defined(__GNUWIN32__)
|
||||
@@ -146,6 +147,9 @@ WXDLLEXPORT long wxExecute(wxChar **argv, bool sync = FALSE,
|
||||
WXDLLEXPORT long wxExecute(const wxString& command, bool sync = FALSE,
|
||||
wxProcess *process = (wxProcess *) NULL);
|
||||
|
||||
// execute the command capturing its output into an array line by line
|
||||
WXDLLEXPORT long wxExecute(const wxString& command, wxArrayString& output);
|
||||
|
||||
enum wxSignal
|
||||
{
|
||||
wxSIGNONE = 0, // verify if the process exists under Unix
|
||||
@@ -272,6 +276,18 @@ WXDLLEXPORT bool wxCheckForInterrupt(wxWindow *wnd);
|
||||
// Consume all events until no more left
|
||||
WXDLLEXPORT void wxFlushEvents();
|
||||
|
||||
// a class which disables all windows (except, may be, thegiven one) in its
|
||||
// ctor and enables them back in its dtor
|
||||
class WXDLLEXPORT wxWindowDisabler
|
||||
{
|
||||
public:
|
||||
wxWindowDisabler(wxWindow *winToSkip = (wxWindow *)NULL);
|
||||
~wxWindowDisabler();
|
||||
|
||||
private:
|
||||
wxWindowList *m_winDisabled;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Cursors
|
||||
// ----------------------------------------------------------------------------
|
||||
|
Reference in New Issue
Block a user