X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8b30a4e4d68084d5bd2e775685d09e72055f4ccf..e9e4acc5197ac49259b9a39468c5931b4459d87f:/include/wx/log.h diff --git a/include/wx/log.h b/include/wx/log.h index 28272c9b9c..04efbd0bd8 100644 --- a/include/wx/log.h +++ b/include/wx/log.h @@ -12,7 +12,7 @@ #ifndef _WX_LOG_H_ #define _WX_LOG_H_ -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(__APPLE__) #pragma interface "log.h" #endif @@ -40,10 +40,20 @@ typedef unsigned long wxLogLevel; #if wxUSE_LOG +#ifndef __WXWINCE__ #include // for time_t +#endif #include "wx/dynarray.h" +#ifndef wxUSE_LOG_DEBUG +# ifdef __WXDEBUG__ +# define wxUSE_LOG_DEBUG 1 +# else // !__WXDEBUG__ +# define wxUSE_LOG_DEBUG 0 +# endif +#endif + // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -55,12 +65,13 @@ enum wxLOG_Error, // a serious error, user must be informed about it wxLOG_Warning, // user is normally informed about it but may be ignored wxLOG_Message, // normal message (i.e. normal output of a non GUI app) - wxLOG_Info, // informational message (a.k.a. 'Verbose') wxLOG_Status, // informational: might go to the status line of GUI app + wxLOG_Info, // informational message (a.k.a. 'Verbose') wxLOG_Debug, // never shown to the user, disabled in release mode wxLOG_Trace, // trace messages are also only enabled in debug mode wxLOG_Progress, // used for progress indicator (not yet) - wxLOG_User = 100 // user defined levels start here + wxLOG_User = 100, // user defined levels start here + wxLOG_Max = 10000 }; // symbolic trace masks - wxLogTrace("foo", "some trace message...") will be @@ -120,7 +131,7 @@ public: // derived classes static void OnLog(wxLogLevel level, const wxChar *szString, time_t t) { - if ( IsEnabled() ) { + if ( IsEnabled() && ms_logLevel >= level ) { wxLog *pLogger = GetActiveTarget(); if ( pLogger ) pLogger->DoLog(level, szString, t); @@ -165,6 +176,10 @@ public: // verbose mode is activated by standard command-line '-verbose' // option static void SetVerbose(bool bVerbose = TRUE) { ms_bVerbose = bVerbose; } + + // Set log level. Log messages with level > logLevel will not be logged. + static void SetLogLevel(wxLogLevel logLevel) { ms_logLevel = logLevel; } + // should GetActiveTarget() try to create a new log object if the // current is NULL? static void DontCreateOnDemand(); @@ -177,12 +192,15 @@ public: static void RemoveTraceMask(const wxString& str); // remove all string trace masks static void ClearTraceMasks(); + // get string trace masks + static const wxArrayString &GetTraceMasks() { return ms_aTraceMasks; } // sets the timestamp string: this is used as strftime() format string // for the log targets which add time stamps to the messages - set it // to NULL to disable time stamping completely. static void SetTimestamp(const wxChar *ts) { ms_timestamp = ts; } + // accessors // gets the verbose status static bool GetVerbose() { return ms_bVerbose; } @@ -191,10 +209,13 @@ public: // is this trace mask in the list? static bool IsAllowedTraceMask(const wxChar *mask) { return ms_aTraceMasks.Index(mask) != wxNOT_FOUND; } + // return the current loglevel limit + static wxLogLevel GetLogLevel() { return ms_logLevel; } // get the current timestamp format string (may be NULL) static const wxChar *GetTimestamp() { return ms_timestamp; } + // helpers // put the time stamp into the string if ms_timestamp != NULL (don't // change it otherwise) @@ -223,6 +244,8 @@ private: static bool ms_bAutoCreate; // create new log targets on demand? static bool ms_bVerbose; // FALSE => ignore LogInfo messages + static wxLogLevel ms_logLevel; // limit logging to levels <= ms_logLevel + static size_t ms_suspendCount; // if positive, logs are not flushed // format string for strftime(), if NULL, time stamping log messages is @@ -240,6 +263,8 @@ private: // log everything to a "FILE *", stderr by default class WXDLLEXPORT wxLogStderr : public wxLog { + DECLARE_NO_COPY_CLASS(wxLogStderr) + public: // redirect log output to a FILE wxLogStderr(FILE *fp = (FILE *) NULL); @@ -293,8 +318,8 @@ protected: class WXDLLEXPORT wxLogNull { public: - wxLogNull() { m_flagOld = wxLog::EnableLogging(FALSE); } - ~wxLogNull() { (void)wxLog::EnableLogging(m_flagOld); } + wxLogNull() : m_flagOld(wxLog::EnableLogging(FALSE)) { } + ~wxLogNull() { (void)wxLog::EnableLogging(m_flagOld); } private: bool m_flagOld; // the previous value of the wxLog::ms_doLog @@ -344,6 +369,8 @@ private: // do we pass the messages to the old logger? bool m_bPassMessages; + + DECLARE_NO_COPY_CLASS(wxLogChain) }; // a chain log target which uses itself as the new logger @@ -375,6 +402,8 @@ private: // the control we use wxTextCtrl *m_pTextCtrl; + + DECLARE_NO_COPY_CLASS(wxLogTextCtrl) }; #endif // wxUSE_TEXTCTRL @@ -453,6 +482,8 @@ protected: private: wxLogFrame *m_pLogFrame; // the log frame + + DECLARE_NO_COPY_CLASS(wxLogWindow) }; #endif // wxUSE_LOGWINDOW @@ -474,20 +505,24 @@ private: // return the last system error code WXDLLEXPORT unsigned long wxSysErrorCode(); + // return the error message for given (or last if 0) error code WXDLLEXPORT const wxChar* wxSysErrorMsg(unsigned long nErrCode = 0); +// ---------------------------------------------------------------------------- // define wxLog -// ------------------- +// ---------------------------------------------------------------------------- #define DECLARE_LOG_FUNCTION(level) \ extern void WXDLLEXPORT wxVLog##level(const wxChar *szFormat, \ va_list argptr); \ -extern void WXDLLEXPORT wxLog##level(const wxChar *szFormat, ...) +extern void WXDLLEXPORT wxLog##level(const wxChar *szFormat, \ + ...) ATTRIBUTE_PRINTF_1 #define DECLARE_LOG_FUNCTION2(level, arg1) \ extern void WXDLLEXPORT wxVLog##level(arg1, const wxChar *szFormat, \ va_list argptr); \ -extern void WXDLLEXPORT wxLog##level(arg1, const wxChar *szFormat, ...) +extern void WXDLLEXPORT wxLog##level(arg1, const wxChar *szFormat, \ + ...) ATTRIBUTE_PRINTF_2 #else // !wxUSE_LOG @@ -531,7 +566,7 @@ DECLARE_LOG_FUNCTION(SysError); DECLARE_LOG_FUNCTION2(SysError, long lErrCode); // debug functions do nothing in release mode -#ifdef __WXDEBUG__ +#if wxUSE_LOG_DEBUG DECLARE_LOG_FUNCTION(Debug); // first kind of LogTrace is unconditional: it doesn't check the level, @@ -557,6 +592,10 @@ DECLARE_LOG_FUNCTION2(SysError, long lErrCode); inline void wxLogTrace(const wxChar *, const wxChar *, ...) { } #endif // debug/!debug +// wxLogFatalError helper: show the (fatal) error to the user in a safe way, +// i.e. without using wxMessageBox() for example because it could crash +void WXDLLEXPORT wxSafeShowMessage(const wxString& title, const wxString& text); + // ---------------------------------------------------------------------------- // debug only logging functions: use them with API name and error code // ---------------------------------------------------------------------------- @@ -567,14 +606,14 @@ DECLARE_LOG_FUNCTION2(SysError, long lErrCode); #ifdef __VISUALC__ #define wxLogApiError(api, rc) \ wxLogDebug(wxT("%s(%d): '%s' failed with error 0x%08lx (%s)."), \ - __TFILE__, __LINE__, api, \ - rc, wxSysErrorMsg(rc)) + __TFILE__, __LINE__, api, \ + (long)rc, wxSysErrorMsg(rc)) #else // !VC++ #define wxLogApiError(api, rc) \ wxLogDebug(wxT("In file %s at line %d: '%s' failed with " \ - "error 0x%08lx (%s)."), \ - __TFILE__, __LINE__, api, \ - rc, wxSysErrorMsg(rc)) + "error 0x%08lx (%s)."), \ + __TFILE__, __LINE__, api, \ + (long)rc, wxSysErrorMsg(rc)) #endif // VC++/!VC++ #define wxLogLastError(api) wxLogApiError(api, wxSysErrorCode())