From d8e41d423d1eceea65f0c8f8bfa2c242028feb5a Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 2 Mar 2000 16:17:43 +0000 Subject: [PATCH] added demo of capturing program output - doesn't work very well though git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6398 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- samples/exec/exec.cpp | 83 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 79 insertions(+), 4 deletions(-) diff --git a/samples/exec/exec.cpp b/samples/exec/exec.cpp index dd794c9b34..9017978836 100644 --- a/samples/exec/exec.cpp +++ b/samples/exec/exec.cpp @@ -38,8 +38,11 @@ #include "wx/menu.h" #include "wx/msgdlg.h" #include "wx/textdlg.h" + #include "wx/listbox.h" #endif +#include "wx/txtstrm.h" + #include "wx/process.h" #ifdef __WINDOWS__ @@ -73,16 +76,24 @@ public: // event handlers (these functions should _not_ be virtual) void OnQuit(wxCommandEvent& event); + void OnClear(wxCommandEvent& event); + void OnSyncExec(wxCommandEvent& event); void OnAsyncExec(wxCommandEvent& event); void OnShell(wxCommandEvent& event); + void OnExecWithRedirect(wxCommandEvent& event); void OnDDEExec(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); + // for MyPipedProcess + wxListBox *GetLogListBox() const { return m_lbox; } + private: wxString m_cmdLast; + wxListBox *m_lbox; + // any class wishing to process wxWindows events must use this macro DECLARE_EVENT_TABLE() }; @@ -91,7 +102,7 @@ private: class MyProcess : public wxProcess { public: - MyProcess(wxFrame *parent, const wxString& cmd) + MyProcess(MyFrame *parent, const wxString& cmd) : wxProcess(parent), m_cmd(cmd) { m_parent = parent; @@ -102,11 +113,24 @@ public: // cases virtual void OnTerminate(int pid, int status); -private: - wxFrame *m_parent; +protected: + MyFrame *m_parent; wxString m_cmd; }; +// A specialization of MyProcess for redirecting the output +class MyPipedProcess : public MyProcess +{ +public: + MyPipedProcess(MyFrame *parent, const wxString& cmd) + : MyProcess(parent, cmd) + { + m_needPipe = TRUE; + } + + virtual void OnTerminate(int pid, int status); +}; + // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -116,10 +140,12 @@ enum { // menu items Exec_Quit = 100, + Exec_ClearLog, Exec_SyncExec = 200, Exec_AsyncExec, Exec_Shell, Exec_DDEExec, + Exec_Redirect, Exec_About = 300 }; @@ -134,10 +160,12 @@ static const wxChar *DIALOG_TITLE = _T("Exec sample"); // simple menu events like this the static method is much simpler. BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(Exec_Quit, MyFrame::OnQuit) + EVT_MENU(Exec_ClearLog, MyFrame::OnClear) EVT_MENU(Exec_SyncExec, MyFrame::OnSyncExec) EVT_MENU(Exec_AsyncExec, MyFrame::OnAsyncExec) EVT_MENU(Exec_Shell, MyFrame::OnShell) + EVT_MENU(Exec_Redirect, MyFrame::OnExecWithRedirect) EVT_MENU(Exec_DDEExec, MyFrame::OnDDEExec) EVT_MENU(Exec_About, MyFrame::OnAbout) @@ -196,6 +224,9 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) // create a menu bar wxMenu *menuFile = new wxMenu(_T(""), wxMENU_TEAROFF); + menuFile->Append(Exec_ClearLog, _T("&Clear log\tCtrl-C"), + _T("Clear the log window")); + menuFile->AppendSeparator(); menuFile->Append(Exec_Quit, _T("E&xit\tAlt-X"), _T("Quit this program")); wxMenu *execMenu = new wxMenu; @@ -205,6 +236,8 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) _T("Launch a program and return immediately")); execMenu->Append(Exec_Shell, _T("Execute &shell command...\tCtrl-S"), _T("Launch a shell and execute a command in it")); + execMenu->Append(Exec_Redirect, _T("Capture command &output...\tCtrl-O"), + _T("Launch a program and capture its output")); #ifdef __WINDOWS__ execMenu->AppendSeparator(); @@ -224,7 +257,7 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) SetMenuBar(menuBar); // create the listbox in which we will show misc messages as they come - m_listbox = new wxListBox(this, -1); + m_lbox = new wxListBox(this, -1); #if wxUSE_STATUSBAR // create a status bar just for fun (by default with 1 pane only) @@ -242,6 +275,11 @@ void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) Close(TRUE); } +void MyFrame::OnClear(wxCommandEvent& WXUNUSED(event)) +{ + m_lbox->Clear(); +} + void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) { wxMessageBox(_T("Exec sample\n© 2000 Vadim Zeitlin"), @@ -300,6 +338,28 @@ void MyFrame::OnShell(wxCommandEvent& WXUNUSED(event)) m_cmdLast = cmd; } +void MyFrame::OnExecWithRedirect(wxCommandEvent& WXUNUSED(event)) +{ + wxString cmd = wxGetTextFromUser(_T("Enter the command: "), + DIALOG_TITLE, + m_cmdLast); + + if ( !cmd ) + return; + + wxProcess *process = new MyPipedProcess(this, cmd); + if ( !wxExecute(cmd, FALSE /* async */, process) ) + { + wxLogError(_T("Execution of '%s' failed."), cmd.c_str()); + + delete process; + } + else + { + m_cmdLast = cmd; + } +} + void MyFrame::OnDDEExec(wxCommandEvent& WXUNUSED(event)) { #ifdef __WINDOWS__ @@ -354,3 +414,18 @@ void MyProcess::OnTerminate(int pid, int status) // we're not needed any more delete this; } + +void MyPipedProcess::OnTerminate(int pid, int status) +{ + // show the program output + wxListBox *lbox = m_parent->GetLogListBox(); + lbox->Append(wxString::Format(_T("--- Output of '%s' ---"), m_cmd.c_str())); + + wxTextInputStream tis(*m_in_stream); + while ( !m_in_stream->LastError() ) + { + lbox->Append(tis.ReadLine()); + } + + MyProcess::OnTerminate(pid, status); +} -- 2.45.2