]>
Commit | Line | Data |
---|---|---|
d14a1e28 RD |
1 | ///////////////////////////////////////////////////////////////////////////// |
2 | // Name: _log.i | |
3 | // Purpose: SWIG interface stuff for wxLog | |
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 | typedef unsigned long wxTraceMask; | |
21 | typedef unsigned long wxLogLevel; | |
22 | ||
23 | ||
24 | enum | |
25 | { | |
26 | wxLOG_FatalError, // program can't continue, abort immediately | |
27 | wxLOG_Error, // a serious error, user must be informed about it | |
28 | wxLOG_Warning, // user is normally informed about it but may be ignored | |
29 | wxLOG_Message, // normal message (i.e. normal output of a non GUI app) | |
30 | wxLOG_Status, // informational: might go to the status line of GUI app | |
31 | wxLOG_Info, // informational message (a.k.a. 'Verbose') | |
32 | wxLOG_Debug, // never shown to the user, disabled in release mode | |
33 | wxLOG_Trace, // trace messages are also only enabled in debug mode | |
34 | wxLOG_Progress, // used for progress indicator (not yet) | |
35 | wxLOG_User = 100, // user defined levels start here | |
36 | wxLOG_Max = 10000 | |
37 | }; | |
38 | ||
39 | #define wxTRACE_MemAlloc "memalloc" // trace memory allocation (new/delete) | |
40 | #define wxTRACE_Messages "messages" // trace window messages/X callbacks | |
41 | #define wxTRACE_ResAlloc "resalloc" // trace GDI resource allocation | |
42 | #define wxTRACE_RefCount "refcount" // trace various ref counting operations | |
43 | #define wxTRACE_OleCalls "ole" // OLE interface calls | |
44 | ||
45 | #define wxTraceMemAlloc 0x0001 // trace memory allocation (new/delete) | |
46 | #define wxTraceMessages 0x0002 // trace window messages/X callbacks | |
47 | #define wxTraceResAlloc 0x0004 // trace GDI resource allocation | |
48 | #define wxTraceRefCount 0x0008 // trace various ref counting operations | |
49 | #define wxTraceOleCalls 0x0100 // OLE interface calls | |
50 | ||
51 | //--------------------------------------------------------------------------- | |
52 | ||
53 | class wxLog | |
54 | { | |
55 | public: | |
56 | wxLog(); | |
57 | ||
58 | ||
59 | // these functions allow to completely disable all log messages | |
60 | // is logging disabled now? | |
61 | static bool IsEnabled(); | |
62 | ||
63 | // change the flag state, return the previous one | |
dd9f7fea | 64 | static bool EnableLogging(bool doIt = True); |
d14a1e28 RD |
65 | |
66 | // static sink function | |
67 | static void OnLog(wxLogLevel level, const wxChar *szString, time_t t); | |
68 | ||
69 | // message buffering | |
70 | // flush shows all messages if they're not logged immediately (FILE | |
71 | // and iostream logs don't need it, but wxGuiLog does to avoid showing | |
72 | // 17 modal dialogs one after another) | |
73 | virtual void Flush(); | |
74 | ||
75 | // flush the active target if any | |
76 | static void FlushActive(); | |
77 | ||
78 | // only one sink is active at each moment | |
79 | // get current log target, will call wxApp::CreateLogTarget() to | |
80 | // create one if none exists | |
81 | static wxLog *GetActiveTarget(); | |
82 | ||
83 | // change log target, pLogger may be NULL | |
84 | static wxLog *SetActiveTarget(wxLog *pLogger); | |
85 | ||
86 | // suspend the message flushing of the main target until the next call | |
87 | // to Resume() - this is mainly for internal use (to prevent wxYield() | |
88 | // from flashing the messages) | |
89 | static void Suspend(); | |
90 | ||
91 | // must be called for each Suspend()! | |
92 | static void Resume(); | |
93 | ||
94 | ||
95 | // verbose mode is activated by standard command-line '-verbose' | |
96 | // option | |
dd9f7fea | 97 | static void SetVerbose(bool bVerbose = True); |
d14a1e28 RD |
98 | |
99 | // Set log level. Log messages with level > logLevel will not be logged. | |
100 | static void SetLogLevel(wxLogLevel logLevel); | |
101 | ||
102 | // should GetActiveTarget() try to create a new log object if the | |
103 | // current is NULL? | |
104 | static void DontCreateOnDemand(); | |
105 | ||
106 | // trace mask (see wxTraceXXX constants for details) | |
107 | static void SetTraceMask(wxTraceMask ulMask); | |
108 | ||
109 | // add string trace mask | |
110 | static void AddTraceMask(const wxString& str); | |
111 | ||
112 | // remove string trace mask | |
113 | static void RemoveTraceMask(const wxString& str); | |
114 | ||
115 | // remove all string trace masks | |
116 | static void ClearTraceMasks(); | |
117 | ||
118 | // get string trace masks | |
119 | static const wxArrayString &GetTraceMasks(); | |
120 | ||
121 | // sets the timestamp string: this is used as strftime() format string | |
122 | // for the log targets which add time stamps to the messages - set it | |
123 | // to NULL to disable time stamping completely. | |
124 | static void SetTimestamp(const wxChar *ts); | |
125 | ||
126 | ||
127 | // gets the verbose status | |
128 | static bool GetVerbose(); | |
129 | ||
130 | // get trace mask | |
131 | static wxTraceMask GetTraceMask(); | |
132 | ||
133 | // is this trace mask in the list? | |
134 | static bool IsAllowedTraceMask(const wxChar *mask); | |
135 | ||
136 | // return the current loglevel limit | |
137 | static wxLogLevel GetLogLevel(); | |
138 | ||
139 | ||
140 | // get the current timestamp format string (may be NULL) | |
141 | static const wxChar *GetTimestamp(); | |
142 | ||
143 | ||
144 | %extend { | |
145 | static wxString TimeStamp() { | |
146 | wxString msg; | |
147 | wxLog::TimeStamp(&msg); | |
148 | return msg; | |
149 | } | |
150 | } | |
151 | ||
152 | %extend { void Destroy() { delete self; } } | |
153 | }; | |
154 | ||
155 | ||
156 | //--------------------------------------------------------------------------- | |
157 | ||
158 | ||
159 | class wxLogStderr : public wxLog | |
160 | { | |
161 | public: | |
162 | wxLogStderr(/* TODO: FILE *fp = (FILE *) NULL*/); | |
163 | }; | |
164 | ||
165 | ||
166 | class wxLogTextCtrl : public wxLog | |
167 | { | |
168 | public: | |
169 | wxLogTextCtrl(wxTextCtrl *pTextCtrl); | |
170 | }; | |
171 | ||
172 | ||
173 | class wxLogGui : public wxLog | |
174 | { | |
175 | public: | |
176 | wxLogGui(); | |
177 | }; | |
178 | ||
179 | class wxLogWindow : public wxLog | |
180 | { | |
181 | public: | |
182 | wxLogWindow(wxFrame *pParent, // the parent frame (can be NULL) | |
183 | const wxString& szTitle, // the title of the frame | |
dd9f7fea RD |
184 | bool bShow = True, // show window immediately? |
185 | bool bPassToOld = True); // pass log messages to the old target? | |
d14a1e28 | 186 | |
dd9f7fea | 187 | void Show(bool bShow = True); |
d14a1e28 RD |
188 | wxFrame *GetFrame() const; |
189 | wxLog *GetOldLog() const; | |
190 | bool IsPassingMessages() const; | |
191 | void PassMessages(bool bDoPass); | |
192 | }; | |
193 | ||
194 | ||
195 | class wxLogChain : public wxLog | |
196 | { | |
197 | public: | |
198 | wxLogChain(wxLog *logger); | |
199 | void SetLog(wxLog *logger); | |
200 | void PassMessages(bool bDoPass); | |
201 | bool IsPassingMessages(); | |
202 | wxLog *GetOldLog(); | |
203 | }; | |
204 | ||
205 | ||
206 | //--------------------------------------------------------------------------- | |
207 | ||
208 | unsigned long wxSysErrorCode(); | |
209 | const wxString wxSysErrorMsg(unsigned long nErrCode = 0); | |
210 | void wxLogFatalError(const wxString& msg); | |
211 | void wxLogError(const wxString& msg); | |
212 | void wxLogWarning(const wxString& msg); | |
213 | void wxLogMessage(const wxString& msg); | |
214 | void wxLogInfo(const wxString& msg); | |
215 | void wxLogDebug(const wxString& msg); | |
216 | void wxLogVerbose(const wxString& msg); | |
217 | void wxLogStatus(const wxString& msg); | |
218 | %name(LogStatusFrame)void wxLogStatus(wxFrame *pFrame, const wxString& msg); | |
219 | void wxLogSysError(const wxString& msg); | |
220 | ||
1b9631c9 RD |
221 | %nokwargs wxLogTrace; |
222 | void wxLogTrace(unsigned long mask, const wxString& msg); | |
223 | void wxLogTrace(const wxString& mask, const wxString& msg); | |
d14a1e28 RD |
224 | |
225 | void wxLogGeneric(unsigned long level, const wxString& msg); | |
226 | ||
227 | // wxLogFatalError helper: show the (fatal) error to the user in a safe way, | |
228 | // i.e. without using wxMessageBox() for example because it could crash | |
229 | void wxSafeShowMessage(const wxString& title, const wxString& text); | |
230 | ||
231 | ||
232 | ||
233 | // Suspress logging while an instance of this class exists | |
234 | class wxLogNull | |
235 | { | |
236 | public: | |
237 | wxLogNull(); | |
238 | ~wxLogNull(); | |
239 | }; | |
240 | ||
241 | ||
242 | ||
243 | //--------------------------------------------------------------------------- | |
244 | ||
245 | %{ | |
246 | // A wxLog class that can be derived from in wxPython | |
247 | class wxPyLog : public wxLog { | |
248 | public: | |
249 | wxPyLog() : wxLog() {} | |
250 | ||
251 | virtual void DoLog(wxLogLevel level, const wxChar *szString, time_t t) { | |
252 | bool found; | |
da32eb53 | 253 | bool blocked = wxPyBeginBlockThreads(); |
d14a1e28 RD |
254 | if ((found = wxPyCBH_findCallback(m_myInst, "DoLog"))) { |
255 | PyObject* s = wx2PyString(szString); | |
256 | wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iOi)", level, s, t)); | |
257 | Py_DECREF(s); | |
258 | } | |
da32eb53 | 259 | wxPyEndBlockThreads(blocked); |
d14a1e28 RD |
260 | if (! found) |
261 | wxLog::DoLog(level, szString, t); | |
262 | } | |
263 | ||
264 | virtual void DoLogString(const wxChar *szString, time_t t) { | |
265 | bool found; | |
da32eb53 | 266 | bool blocked = wxPyBeginBlockThreads(); |
d14a1e28 RD |
267 | if ((found = wxPyCBH_findCallback(m_myInst, "DoLogString"))) { |
268 | PyObject* s = wx2PyString(szString); | |
269 | wxPyCBH_callCallback(m_myInst, Py_BuildValue("(Oi)", s, t)); | |
270 | Py_DECREF(s); | |
271 | } | |
da32eb53 | 272 | wxPyEndBlockThreads(blocked); |
d14a1e28 RD |
273 | if (! found) |
274 | wxLog::DoLogString(szString, t); | |
275 | } | |
276 | ||
277 | PYPRIVATE; | |
278 | }; | |
279 | %} | |
280 | ||
281 | // Now tell SWIG about it | |
282 | class wxPyLog : public wxLog { | |
283 | public: | |
2b9048c5 | 284 | %pythonAppend wxPyLog "self._setCallbackInfo(self, PyLog)" |
d14a1e28 RD |
285 | |
286 | wxPyLog(); | |
287 | ||
288 | void _setCallbackInfo(PyObject* self, PyObject* _class); | |
289 | }; | |
290 | ||
291 | //--------------------------------------------------------------------------- |