1 /////////////////////////////////////////////////////////////////////////////
 
   3 // Purpose:     SWIG interface stuff for wxLog
 
   7 // Created:     18-June-1999
 
   9 // Copyright:   (c) 2003 by Total Control Software
 
  10 // Licence:     wxWindows license
 
  11 /////////////////////////////////////////////////////////////////////////////
 
  16 //---------------------------------------------------------------------------
 
  20 typedef unsigned long wxTraceMask;
 
  21 typedef unsigned long wxLogLevel;
 
  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
 
  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
 
  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
 
  51 //---------------------------------------------------------------------------
 
  59     // these functions allow to completely disable all log messages
 
  60     // is logging disabled now?
 
  61     static bool IsEnabled();
 
  63     // change the flag state, return the previous one
 
  64     static bool EnableLogging(bool doIt = true);
 
  66     // static sink function
 
  67     static void OnLog(wxLogLevel level, const wxChar *szString, time_t t);    
 
  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)
 
  75     // flush the active target if any
 
  76     static void FlushActive();
 
  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();
 
  83     %disownarg( wxLog* pLogger );
 
  84     %newobject SetActiveTarget;
 
  85     // change log target, pLogger may be NULL
 
  86     static wxLog *SetActiveTarget(wxLog *pLogger);
 
  87     %cleardisown( wxLog* pLogger );
 
  89     // suspend the message flushing of the main target until the next call
 
  90     // to Resume() - this is mainly for internal use (to prevent wxYield()
 
  91     // from flashing the messages)
 
  92     static void Suspend();
 
  94     // must be called for each Suspend()!
 
  98     // verbose mode is activated by standard command-line '-verbose'
 
 100     static void SetVerbose(bool bVerbose = true);
 
 102     // Set log level.  Log messages with level > logLevel will not be logged.
 
 103     static void SetLogLevel(wxLogLevel logLevel);
 
 105     // should GetActiveTarget() try to create a new log object if the
 
 107     static void DontCreateOnDemand();
 
 109     // trace mask (see wxTraceXXX constants for details)
 
 110     static void SetTraceMask(wxTraceMask ulMask);
 
 112     // add string trace mask
 
 113     static void AddTraceMask(const wxString& str);
 
 115     // remove string trace mask
 
 116     static void RemoveTraceMask(const wxString& str);
 
 118     // remove all string trace masks
 
 119     static void ClearTraceMasks();
 
 121     // get string trace masks
 
 122     static const wxArrayString &GetTraceMasks();
 
 124     // sets the timestamp string: this is used as strftime() format string
 
 125     // for the log targets which add time stamps to the messages - set it
 
 126     // to NULL to disable time stamping completely.
 
 127     static void SetTimestamp(const wxChar *ts);
 
 130     // gets the verbose status
 
 131     static bool GetVerbose();
 
 134     static wxTraceMask GetTraceMask();
 
 136     // is this trace mask in the list?
 
 137     static bool IsAllowedTraceMask(const wxChar *mask);
 
 139     // return the current loglevel limit
 
 140     static wxLogLevel GetLogLevel();
 
 143     // get the current timestamp format string (may be NULL)
 
 144     static const wxChar *GetTimestamp();
 
 148         static wxString TimeStamp() {
 
 150             wxLog::TimeStamp(&msg);
 
 155     %pythonAppend Destroy "args[0].thisown = 0";
 
 156     %extend { void Destroy() { delete self; } }
 
 160 //---------------------------------------------------------------------------
 
 163 class wxLogStderr : public wxLog
 
 166     wxLogStderr(/* TODO: FILE *fp = (FILE *) NULL*/);
 
 170 class wxLogTextCtrl : public wxLog
 
 173     wxLogTextCtrl(wxTextCtrl *pTextCtrl);
 
 177 class wxLogGui : public wxLog
 
 183 class wxLogWindow : public wxLog
 
 186     wxLogWindow(wxFrame *pParent,         // the parent frame (can be NULL)
 
 187             const wxString& szTitle,      // the title of the frame
 
 188             bool bShow = true,            // show window immediately?
 
 189             bool bPassToOld = true);      // pass log messages to the old target?
 
 191     void Show(bool bShow = true);
 
 192     wxFrame *GetFrame() const;
 
 193     wxLog *GetOldLog() const;
 
 194     bool IsPassingMessages() const;
 
 195     void PassMessages(bool bDoPass);
 
 199 class wxLogChain : public wxLog
 
 202     wxLogChain(wxLog *logger);
 
 203     void SetLog(wxLog *logger);
 
 204     void PassMessages(bool bDoPass);
 
 205     bool IsPassingMessages();
 
 209 // log everything to a buffer
 
 210 class wxLogBuffer : public wxLog
 
 215     // get the string contents with all messages logged
 
 216     const wxString& GetBuffer() const { return m_str; }
 
 218     // show the buffer contents to the user in the best possible way (this uses
 
 219     // wxMessageOutputMessageBox) and clear it
 
 220     virtual void Flush();
 
 224 //---------------------------------------------------------------------------
 
 226 unsigned long wxSysErrorCode();
 
 227 const wxString wxSysErrorMsg(unsigned long nErrCode = 0);
 
 229 %{// Make some wrappers that double any % signs so they are 'escaped'
 
 230     void wxPyLogFatalError(const wxString& msg)
 
 233         m.Replace(wxT("%"), wxT("%%"));
 
 237     void wxPyLogError(const wxString& msg)
 
 240         m.Replace(wxT("%"), wxT("%%"));
 
 244     void wxPyLogWarning(const wxString& msg)
 
 247         m.Replace(wxT("%"), wxT("%%"));
 
 251     void wxPyLogMessage(const wxString& msg)
 
 254         m.Replace(wxT("%"), wxT("%%"));
 
 258     void wxPyLogInfo(const wxString& msg)
 
 261         m.Replace(wxT("%"), wxT("%%"));
 
 265     void wxPyLogDebug(const wxString& msg)
 
 268         m.Replace(wxT("%"), wxT("%%"));
 
 272     void wxPyLogVerbose(const wxString& msg)
 
 275         m.Replace(wxT("%"), wxT("%%"));
 
 279     void wxPyLogStatus(const wxString& msg)
 
 282         m.Replace(wxT("%"), wxT("%%"));
 
 286     void wxPyLogStatusFrame(wxFrame *pFrame, const wxString& msg)
 
 289         m.Replace(wxT("%"), wxT("%%"));
 
 290         wxLogStatus(pFrame, m);
 
 293     void wxPyLogSysError(const wxString& msg)
 
 296         m.Replace(wxT("%"), wxT("%%"));
 
 300     void wxPyLogGeneric(unsigned long level, const wxString& msg)
 
 303         m.Replace(wxT("%"), wxT("%%"));
 
 304         wxLogGeneric(level, m);
 
 307     void wxPyLogTrace(unsigned long mask, const wxString& msg)
 
 310         m.Replace(wxT("%"), wxT("%%"));
 
 314     void wxPyLogTrace(const wxString& mask, const wxString& msg)
 
 317         m.Replace(wxT("%"), wxT("%%"));
 
 323 %Rename(LogFatalError,  void, wxPyLogFatalError(const wxString& msg));
 
 324 %Rename(LogError,  void, wxPyLogError(const wxString& msg));
 
 325 %Rename(LogWarning,  void, wxPyLogWarning(const wxString& msg));
 
 326 %Rename(LogMessage,  void, wxPyLogMessage(const wxString& msg));
 
 327 %Rename(LogInfo,  void, wxPyLogInfo(const wxString& msg));
 
 328 %Rename(LogDebug,  void, wxPyLogDebug(const wxString& msg));
 
 329 %Rename(LogVerbose,  void, wxPyLogVerbose(const wxString& msg));
 
 330 %Rename(LogStatus,  void, wxPyLogStatus(const wxString& msg));
 
 331 %Rename(LogStatusFrame,  void, wxPyLogStatusFrame(wxFrame *pFrame, const wxString& msg));
 
 332 %Rename(LogSysError,  void, wxPyLogSysError(const wxString& msg));
 
 334 %Rename(LogGeneric,  void, wxPyLogGeneric(unsigned long level, const wxString& msg));
 
 336 %nokwargs wxPyLogTrace;
 
 337 %Rename(LogTrace,  void, wxPyLogTrace(unsigned long mask, const wxString& msg));
 
 338 %Rename(LogTrace,  void, wxPyLogTrace(const wxString& mask, const wxString& msg));
 
 341 // wxLogFatalError helper: show the (fatal) error to the user in a safe way,
 
 342 // i.e. without using wxMessageBox() for example because it could crash
 
 343 void wxSafeShowMessage(const wxString& title, const wxString& text);
 
 347 // Suspress logging while an instance of this class exists
 
 357 //---------------------------------------------------------------------------
 
 360 // A wxLog class that can be derived from in wxPython
 
 361 class wxPyLog : public wxLog {
 
 363     wxPyLog() : wxLog() {}
 
 365     virtual void DoLog(wxLogLevel level, const wxChar *szString, time_t t) {
 
 367         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 368         if ((found = wxPyCBH_findCallback(m_myInst, "DoLog"))) {
 
 369             PyObject* s = wx2PyString(szString);
 
 370             wxPyCBH_callCallback(m_myInst, Py_BuildValue("(iOi)", level, s, t));
 
 373         wxPyEndBlockThreads(blocked);
 
 375             wxLog::DoLog(level, szString, t);
 
 378     virtual void DoLogString(const wxChar *szString, time_t t) {
 
 380         wxPyBlock_t blocked = wxPyBeginBlockThreads();
 
 381         if ((found = wxPyCBH_findCallback(m_myInst, "DoLogString"))) {
 
 382             PyObject* s = wx2PyString(szString);
 
 383             wxPyCBH_callCallback(m_myInst, Py_BuildValue("(Oi)", s, t));
 
 386         wxPyEndBlockThreads(blocked);
 
 388             wxLog::DoLogString(szString, t);
 
 391     DEC_PYCALLBACK_VOID_(Flush);
 
 394 IMP_PYCALLBACK_VOID_(wxPyLog, wxLog, Flush);
 
 397 // Now tell SWIG about it
 
 398 class wxPyLog : public wxLog {
 
 400     %pythonAppend wxPyLog   "self._setCallbackInfo(self, PyLog)"
 
 404     void _setCallbackInfo(PyObject* self, PyObject* _class);
 
 407 //---------------------------------------------------------------------------