#ifndef _WX_LOG_H_
#define _WX_LOG_H_
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(__APPLE__)
#pragma interface "log.h"
#endif
#if wxUSE_LOG
+#ifndef __WXWINCE__
#include <time.h> // 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
// ----------------------------------------------------------------------------
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
// ctor
wxLog();
+ // Internal buffer.
+ // Allow replacement of the fixed size static buffer with
+ // a user allocated one. Pass in NULL to restore the
+ // built in static buffer.
+ static wxChar *SetLogBuffer( wxChar *buf, size_t size = 0 );
+
// these functions allow to completely disable all log messages
// is logging disabled now?
static bool IsEnabled() { return ms_doLog; }
// 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);
// 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();
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; }
// 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)
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
// 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);
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
{
public:
wxLogChain(wxLog *logger);
- virtual ~wxLogChain() { delete m_logOld; }
+ virtual ~wxLogChain();
// change the new log target
void SetLog(wxLog *logger);
// 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
// the control we use
wxTextCtrl *m_pTextCtrl;
+
+ DECLARE_NO_COPY_CLASS(wxLogTextCtrl)
};
#endif // wxUSE_TEXTCTRL
private:
wxLogFrame *m_pLogFrame; // the log frame
+
+ DECLARE_NO_COPY_CLASS(wxLogWindow)
};
#endif // wxUSE_LOGWINDOW
// 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<level>
-// -------------------
+// ----------------------------------------------------------------------------
#define DECLARE_LOG_FUNCTION(level) \
-extern void WXDLLEXPORT wxLog##level(const wxChar *szFormat, \
+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 wxLog##level(arg1, const wxChar *szFormat, \
+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
// log functions do nothing at all
#define DECLARE_LOG_FUNCTION(level) \
-inline void WXDLLEXPORT wxLog##level(const wxChar *szFormat, \
+inline void WXDLLEXPORT wxVLog##level(const wxChar *szFormat, \
va_list argptr) {} \
inline void WXDLLEXPORT wxLog##level(const wxChar *szFormat, ...) {}
#define DECLARE_LOG_FUNCTION2(level, arg1) \
-inline void WXDLLEXPORT wxLog##level(arg1, const wxChar *szFormat, \
+inline void WXDLLEXPORT wxVLog##level(arg1, const wxChar *szFormat, \
va_list argptr) {} \
inline void WXDLLEXPORT wxLog##level(arg1, const wxChar *szFormat, ...) {}
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,
DECLARE_LOG_FUNCTION2(Trace, wxTraceMask mask);
#else //!debug
// these functions do nothing in release builds
- inline void wxLogDebug(const wxChar *, va_list) { }
+ inline void wxVLogDebug(const wxChar *, va_list) { }
inline void wxLogDebug(const wxChar *, ...) { }
- inline void wxLogTrace(const wxChar *, va_list) { }
+ inline void wxVLogTrace(const wxChar *, va_list) { }
inline void wxLogTrace(const wxChar *, ...) { }
- inline void wxLogTrace(wxTraceMask, const wxChar *, va_list) { }
+ inline void wxVLogTrace(wxTraceMask, const wxChar *, va_list) { }
inline void wxLogTrace(wxTraceMask, const wxChar *, ...) { }
- inline void wxLogTrace(const wxChar *, const wxChar *, va_list) { }
+ inline void wxVLogTrace(const wxChar *, const wxChar *, va_list) { }
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
// ----------------------------------------------------------------------------
#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())
#endif //debug/!debug
#endif // _WX_LOG_H_
+
+// vi:sts=4:sw=4:et