]> git.saurik.com Git - wxWidgets.git/blob - wxPython/src/_process.i
have only one string form of operator<< in output streams
[wxWidgets.git] / wxPython / src / _process.i
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: _process.i
3 // Purpose: SWIG interface stuff for wxProcess and wxExecute
4 //
5 // Author: Robin Dunn
6 //
7 // Created: 18-June-1999
8 // RCS-ID: $Id$
9 // Copyright: (c) 2003 by Total Control Software
10 // Licence: wxWindows license
11 /////////////////////////////////////////////////////////////////////////////
12
13 // Not a %module
14
15
16 //---------------------------------------------------------------------------
17 %newgroup
18
19 %{
20 %}
21
22 //---------------------------------------------------------------------------
23
24 enum
25 {
26 // no redirection
27 wxPROCESS_DEFAULT = 0,
28
29 // redirect the IO of the child process
30 wxPROCESS_REDIRECT = 1
31 };
32
33 enum wxKillError
34 {
35 wxKILL_OK, // no error
36 wxKILL_BAD_SIGNAL, // no such signal
37 wxKILL_ACCESS_DENIED, // permission denied
38 wxKILL_NO_PROCESS, // no such process
39 wxKILL_ERROR // another, unspecified error
40 };
41
42 enum wxKillFlags
43 {
44 wxKILL_NOCHILDREN = 0, // don't kill children
45 wxKILL_CHILDREN = 1 // kill children
46 };
47
48
49 enum wxSignal
50 {
51 wxSIGNONE = 0, // verify if the process exists under Unix
52 wxSIGHUP,
53 wxSIGINT,
54 wxSIGQUIT,
55 wxSIGILL,
56 wxSIGTRAP,
57 wxSIGABRT,
58 wxSIGIOT = wxSIGABRT, // another name
59 wxSIGEMT,
60 wxSIGFPE,
61 wxSIGKILL,
62 wxSIGBUS,
63 wxSIGSEGV,
64 wxSIGSYS,
65 wxSIGPIPE,
66 wxSIGALRM,
67 wxSIGTERM
68
69 // further signals are different in meaning between different Unix systems
70 };
71
72
73 //---------------------------------------------------------------------------
74
75
76 %{
77 IMP_PYCALLBACK_VOID_INTINT( wxPyProcess, wxProcess, OnTerminate);
78 %}
79
80
81 %rename(Process) wxPyProcess;
82 class wxPyProcess : public wxEvtHandler {
83 public:
84 // kill the process with the given PID
85 static wxKillError Kill(int pid,
86 wxSignal sig = wxSIGTERM,
87 int flags = wxKILL_NOCHILDREN);
88
89 // test if the given process exists
90 static bool Exists(int pid);
91
92 // this function replaces the standard popen() one: it launches a process
93 // asynchronously and allows the caller to get the streams connected to its
94 // std{in|out|err}
95 //
96 // on error NULL is returned, in any case the process object will be
97 // deleted automatically when the process terminates and should *not* be
98 // deleted by the caller
99 static wxPyProcess *Open(const wxString& cmd, int flags = wxEXEC_ASYNC);
100
101
102 %pythonAppend wxPyProcess setCallbackInfo(Process) "; self.this.own(False)"
103 wxPyProcess(wxEvtHandler *parent = NULL, int id = -1);
104 ~wxPyProcess();
105
106 void _setCallbackInfo(PyObject* self, PyObject* _class);
107
108
109 DocDeclStr(
110 long , GetPid() const,
111 "get the process ID of the process executed by Open()", "");
112
113
114 void OnTerminate(int pid, int status);
115 %MAKE_BASE_FUNC(Process, OnTerminate);
116
117 // call Redirect before passing the object to wxExecute() to redirect the
118 // launched process stdin/stdout, then use GetInputStream() and
119 // GetOutputStream() to get access to them
120 void Redirect();
121 bool IsRedirected();
122
123
124 // detach from the parent - should be called by the parent if it's deleted
125 // before the process it started terminates
126 void Detach();
127
128 wxInputStream *GetInputStream();
129 wxInputStream *GetErrorStream();
130 wxOutputStream *GetOutputStream();
131
132 void CloseOutput();
133
134 // return True if the child process stdout is not closed
135 bool IsInputOpened() const;
136
137 // return True if any input is available on the child process stdout/err
138 bool IsInputAvailable() const;
139 bool IsErrorAvailable() const;
140
141 %property(ErrorStream, GetErrorStream, doc="See `GetErrorStream`");
142 %property(InputStream, GetInputStream, doc="See `GetInputStream`");
143 %property(OutputStream, GetOutputStream, doc="See `GetOutputStream`");
144
145 %property(InputOpened, IsInputOpened);
146 %property(InputAvailable, IsInputAvailable);
147 %property(ErrorAvailable, IsErrorAvailable);
148 };
149
150 //---------------------------------------------------------------------------
151
152
153 class wxProcessEvent : public wxEvent {
154 public:
155 wxProcessEvent(int id = 0, int pid = 0, int exitcode = 0);
156 int GetPid();
157 int GetExitCode();
158 int m_pid, m_exitcode;
159
160 %property(ExitCode, GetExitCode, doc="See `GetExitCode`");
161 %property(Pid, GetPid, doc="See `GetPid`");
162 };
163
164
165 %constant wxEventType wxEVT_END_PROCESS;
166
167 %pythoncode {
168 EVT_END_PROCESS = wx.PyEventBinder( wxEVT_END_PROCESS, 1 )
169 }
170
171 //---------------------------------------------------------------------------
172
173 enum
174 {
175 // execute the process asynchronously
176 wxEXEC_ASYNC = 0,
177
178 // execute it synchronously, i.e. wait until it finishes
179 wxEXEC_SYNC = 1,
180
181 // under Windows, don't hide the child even if it's IO is redirected (this
182 // is done by default)
183 wxEXEC_NOHIDE = 2,
184
185 // under Unix, if the process is the group leader then killing -pid kills
186 // all children as well as pid
187 wxEXEC_MAKE_GROUP_LEADER = 4,
188
189 // by default synchronous execution disables all program windows to avoid
190 // that the user interacts with the program while the child process is
191 // running, you can use this flag to prevent this from happening
192 wxEXEC_NODISABLE = 8,
193
194 // by default, the event loop is run while waiting for synchronous execution
195 // to complete and this flag can be used to simply block the main process
196 // until the child process finishes
197 wxEXEC_NOEVENTS = 16,
198
199 // convenient synonym for flags given system()-like behaviour
200 wxEXEC_BLOCK = wxEXEC_SYNC | wxEXEC_NOEVENTS
201 };
202
203
204 MustHaveApp(wxExecute);
205
206 long wxExecute(const wxString& command,
207 int flags = wxEXEC_ASYNC,
208 wxPyProcess *process = NULL);
209
210
211
212 %typemap(in,numinputs=0) wxKillError* rc ( wxKillError temp ) { $1 = &temp; }
213 %typemap(argout) wxKillError* rc
214 {
215 PyObject* o;
216 o = PyInt_FromLong((long) (*$1));
217 #if SWIG_VERSION < 0x010328
218 $result = t_output_helper($result, o);
219 #else
220 $result = SWIG_Python_AppendOutput($result, o);
221 #endif
222 }
223
224 int wxKill(long pid, wxSignal sig = wxSIGTERM, wxKillError* rc, int flags = wxKILL_NOCHILDREN);
225
226
227 //---------------------------------------------------------------------------
228 %init %{
229 wxPyPtrTypeMap_Add("wxProcess", "wxPyProcess");
230 %}
231 //---------------------------------------------------------------------------