X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/67393addd823ea1a9b653a93c8554e7fd013ecfa..b7e9f8b136c02826c7e5b3bf9b339d2013ac05f6:/include/wx/log.h diff --git a/include/wx/log.h b/include/wx/log.h index 4561205cbe..254df43702 100644 --- a/include/wx/log.h +++ b/include/wx/log.h @@ -70,10 +70,10 @@ typedef unsigned long wxLogLevel; // ---------------------------------------------------------------------------- #if wxUSE_GUI - class WXDLLIMPEXP_CORE wxTextCtrl; - class WXDLLIMPEXP_CORE wxLogFrame; - class WXDLLIMPEXP_CORE wxFrame; - class WXDLLIMPEXP_CORE wxWindow; + class WXDLLIMPEXP_FWD_CORE wxTextCtrl; + class WXDLLIMPEXP_FWD_CORE wxLogFrame; + class WXDLLIMPEXP_FWD_CORE wxFrame; + class WXDLLIMPEXP_FWD_CORE wxWindow; #endif // wxUSE_GUI // ---------------------------------------------------------------------------- @@ -81,7 +81,7 @@ typedef unsigned long wxLogLevel; // ---------------------------------------------------------------------------- // different standard log levels (you may also define your own) -enum +enum wxLogLevelValues { wxLOG_FatalError, // program can't continue, abort immediately wxLOG_Error, // a serious error, user must be informed about it @@ -133,7 +133,7 @@ public: // static sink function - see DoLog() for function to overload in the // derived classes - static void OnLog(wxLogLevel level, const wxChar *szString, time_t t); + static void OnLog(wxLogLevel level, const wxString& szString, time_t t); // message buffering @@ -181,6 +181,9 @@ public: // current is NULL? static void DontCreateOnDemand(); + // Make GetActiveTarget() create a new log object again. + static void DoCreateOnDemand(); + // log the count of repeating messages instead of logging the messages // multiple times static void SetRepetitionCounting(bool bRepetCounting = true) @@ -205,10 +208,13 @@ public: // 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; } + // sets the time stamp string format: this is used as strftime() format + // string for the log targets which add time stamps to the messages; set + // it to empty string to disable time stamping completely. + static void SetTimestamp(const wxString& ts) { ms_timestamp = ts; } + + // disable time stamping of log messages + static void DisableTimestamp() { SetTimestamp(wxEmptyString); } // accessors @@ -220,13 +226,13 @@ public: static wxTraceMask GetTraceMask() { return ms_ulTraceMask; } // is this trace mask in the list? - static bool IsAllowedTraceMask(const wxChar *mask); + static bool IsAllowedTraceMask(const wxString& mask); // 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; } + static const wxString& GetTimestamp() { return ms_timestamp; } // helpers @@ -252,11 +258,48 @@ protected: // default DoLog() prepends the time stamp and a prefix corresponding // to the message to szString and then passes it to DoLogString() - virtual void DoLog(wxLogLevel level, const wxChar *szString, time_t t); + virtual void DoLog(wxLogLevel level, const wxString& szString, time_t t); +#if WXWIN_COMPATIBILITY_2_8 + // these shouldn't be used by new code + wxDEPRECATED_BUT_USED_INTERNALLY( + virtual void DoLog(wxLogLevel level, const char *szString, time_t t) + ); + + wxDEPRECATED_BUT_USED_INTERNALLY( + virtual void DoLog(wxLogLevel level, const wchar_t *wzString, time_t t) + ); +#endif // WXWIN_COMPATIBILITY_2_8 + + void LogString(const wxString& szString, time_t t) + { DoLogString(szString, t); } // default DoLogString does nothing but is not pure virtual because if // you override DoLog() you might not need it at all - virtual void DoLogString(const wxChar *szString, time_t t); + virtual void DoLogString(const wxString& szString, time_t t); +#if WXWIN_COMPATIBILITY_2_8 + // these shouldn't be used by new code + virtual void DoLogString(const char *WXUNUSED(szString), + time_t WXUNUSED(t)) {} + virtual void DoLogString(const wchar_t *WXUNUSED(szString), + time_t WXUNUSED(t)) {} +#endif // WXWIN_COMPATIBILITY_2_8 + + // this macro should be used in the derived classes to avoid warnings about + // hiding the other DoLog() overloads when overriding DoLog(wxString) -- + // but don't use it with MSVC which doesn't give this warning but does give + // warning when a deprecated function is overridden +#if WXWIN_COMPATIBILITY_2_8 && !defined(__VISUALC__) + #define wxSUPPRESS_DOLOG_HIDE_WARNING() \ + virtual void DoLog(wxLogLevel, const char *, time_t) { } \ + virtual void DoLog(wxLogLevel, const wchar_t *, time_t) { } + + #define wxSUPPRESS_DOLOGSTRING_HIDE_WARNING() \ + virtual void DoLogString(const char *, time_t) { } \ + virtual void DoLogString(const wchar_t *, time_t) { } +#else + #define wxSUPPRESS_DOLOG_HIDE_WARNING() + #define wxSUPPRESS_DOLOGSTRING_HIDE_WARNING() +#endif // log a line containing the number of times the previous message was // repeated @@ -286,7 +329,7 @@ private: // format string for strftime(), if NULL, time stamping log messages is // disabled - static const wxChar *ms_timestamp; + static wxString ms_timestamp; static wxTraceMask ms_ulTraceMask; // controls wxLogTrace behaviour static wxArrayString ms_aTraceMasks; // more powerful filter for wxLogTrace @@ -310,8 +353,11 @@ public: virtual void Flush(); protected: - virtual void DoLog(wxLogLevel level, const wxChar *szString, time_t t); - virtual void DoLogString(const wxChar *szString, time_t t); + virtual void DoLog(wxLogLevel level, const wxString& szString, time_t t); + virtual void DoLogString(const wxString& szString, time_t t); + + wxSUPPRESS_DOLOG_HIDE_WARNING() + wxSUPPRESS_DOLOGSTRING_HIDE_WARNING() private: wxString m_str; @@ -329,7 +375,9 @@ public: protected: // implement sink function - virtual void DoLogString(const wxChar *szString, time_t t); + virtual void DoLogString(const wxString& szString, time_t t); + + wxSUPPRESS_DOLOGSTRING_HIDE_WARNING() FILE *m_fp; @@ -347,7 +395,9 @@ public: protected: // implement sink function - virtual void DoLogString(const wxChar *szString, time_t t); + virtual void DoLogString(const wxString& szString, time_t t); + + wxSUPPRESS_DOLOGSTRING_HIDE_WARNING() // using ptr here to avoid including from this file wxSTD ostream *m_ostr; @@ -416,9 +466,14 @@ public: // override base class version to flush the old logger as well virtual void Flush(); + // call to avoid destroying the old log target + void DetachOldLog() { m_logOld = NULL; } + protected: // pass the chain to the old logger if needed - virtual void DoLog(wxLogLevel level, const wxChar *szString, time_t t); + virtual void DoLog(wxLogLevel level, const wxString& szString, time_t t); + + wxSUPPRESS_DOLOG_HIDE_WARNING() private: // the current log target @@ -434,13 +489,28 @@ private: }; // a chain log target which uses itself as the new logger -class WXDLLIMPEXP_BASE wxLogPassThrough : public wxLogChain + +#define wxLogPassThrough wxLogInterposer + +class WXDLLIMPEXP_BASE wxLogInterposer : public wxLogChain { public: - wxLogPassThrough(); + wxLogInterposer(); private: - DECLARE_NO_COPY_CLASS(wxLogPassThrough) + DECLARE_NO_COPY_CLASS(wxLogInterposer) +}; + +// a temporary interposer which doesn't destroy the old log target +// (calls DetachOldLog) + +class WXDLLIMPEXP_BASE wxLogInterposerTemp : public wxLogChain +{ +public: + wxLogInterposerTemp(); + +private: + DECLARE_NO_COPY_CLASS(wxLogInterposerTemp) }; #if wxUSE_GUI @@ -471,38 +541,111 @@ WXDLLIMPEXP_BASE const wxChar* wxSysErrorMsg(unsigned long nErrCode = 0); // define wxLog // ---------------------------------------------------------------------------- -#define DECLARE_LOG_FUNCTION_PUBLIC(level) \ - /* void wxLog##level(const wxChar *szFormat, ...); */ \ - WX_DEFINE_VARARG_FUNC_VOID(wxLog##level, wxDoLog##level) +#define DECLARE_LOG_FUNCTION(level) \ + extern void WXDLLIMPEXP_BASE \ + wxDoLog##level##Wchar(const wxChar *format, ...); \ + extern void WXDLLIMPEXP_BASE \ + wxDoLog##level##Utf8(const char *format, ...); \ + WX_DEFINE_VARARG_FUNC_VOID(wxLog##level, \ + 1, (const wxFormatString&), \ + wxDoLog##level##Wchar, wxDoLog##level##Utf8) \ + DECLARE_LOG_FUNCTION_WATCOM(level) \ + extern void WXDLLIMPEXP_BASE wxVLog##level(const wxString& format, \ + va_list argptr) + +#ifdef __WATCOMC__ + // workaround for http://bugzilla.openwatcom.org/show_bug.cgi?id=351; + // can't use WX_WATCOM_ONLY_CODE here because the macro would expand to + // something too big for Borland C++ to handle + #define DECLARE_LOG_FUNCTION_WATCOM(level) \ + WX_VARARG_WATCOM_WORKAROUND(void, wxLog##level, \ + 1, (const wxString&), \ + (wxFormatString(f1))) \ + WX_VARARG_WATCOM_WORKAROUND(void, wxLog##level, \ + 1, (const wxCStrData&), \ + (wxFormatString(f1))) \ + WX_VARARG_WATCOM_WORKAROUND(void, wxLog##level, \ + 1, (const char*), \ + (wxFormatString(f1))) \ + WX_VARARG_WATCOM_WORKAROUND(void, wxLog##level, \ + 1, (const wchar_t*), \ + (wxFormatString(f1))) +#else + #define DECLARE_LOG_FUNCTION_WATCOM(level) +#endif -#define DECLARE_LOG_FUNCTION_IMPL(level) \ - extern void WXDLLIMPEXP_BASE wxVLog##level(const wxChar *szFormat, \ - va_list argptr); \ - extern void WXDLLIMPEXP_BASE wxDoLog##level(const wxChar *szFormat, \ - ...) ATTRIBUTE_PRINTF_1 -#define DECLARE_LOG_FUNCTION2_EXP_IMPL(level, argclass, arg, expdecl) \ +#define DECLARE_LOG_FUNCTION2_EXP(level, argclass, arg, expdecl) \ + extern void expdecl wxDoLog##level##Wchar(argclass arg, \ + const wxChar *format, ...); \ + extern void expdecl wxDoLog##level##Utf8(argclass arg, \ + const char *format, ...); \ + WX_DEFINE_VARARG_FUNC_VOID(wxLog##level, \ + 2, (argclass, const wxFormatString&), \ + wxDoLog##level##Wchar, wxDoLog##level##Utf8) \ + DECLARE_LOG_FUNCTION2_EXP_WATCOM(level, argclass, arg, expdecl) \ extern void expdecl wxVLog##level(argclass arg, \ - const wxChar *szFormat, \ - va_list argptr); \ - extern void expdecl wxDoLog##level(argclass arg, \ - const wxChar *szFormat, \ - ...) ATTRIBUTE_PRINTF_2 + const wxString& format, \ + va_list argptr) + +#ifdef __WATCOMC__ + // workaround for http://bugzilla.openwatcom.org/show_bug.cgi?id=351; + // can't use WX_WATCOM_ONLY_CODE here because the macro would expand to + // something too big for Borland C++ to handle + #define DECLARE_LOG_FUNCTION2_EXP_WATCOM(level, argclass, arg, expdecl) \ + WX_VARARG_WATCOM_WORKAROUND(void, wxLog##level, \ + 2, (argclass, const wxString&), \ + (f1, wxFormatString(f2))) \ + WX_VARARG_WATCOM_WORKAROUND(void, wxLog##level, \ + 2, (argclass, const wxCStrData&), \ + (f1, wxFormatString(f2))) \ + WX_VARARG_WATCOM_WORKAROUND(void, wxLog##level, \ + 2, (argclass, const char*), \ + (f1, wxFormatString(f2))) \ + WX_VARARG_WATCOM_WORKAROUND(void, wxLog##level, \ + 2, (argclass, const wchar_t*), \ + (f1, wxFormatString(f2))) +#else + #define DECLARE_LOG_FUNCTION2_EXP_WATCOM(level, argclass, arg, expdecl) +#endif + #else // !wxUSE_LOG -// log functions do nothing at all -#define DECLARE_LOG_FUNCTION_PUBLIC(level) \ - /* void wxLog##level(const wxChar *szFormat, ...) {} */ \ - WX_DEFINE_VARARG_FUNC_NOP(wxLog##level) +#ifdef __WATCOMC__ + // workaround for http://bugzilla.openwatcom.org/show_bug.cgi?id=351 + #define WX_WATCOM_ONLY_CODE( x ) x +#else + #define WX_WATCOM_ONLY_CODE( x ) +#endif + +#if defined(__WATCOMC__) || defined(__MINGW32__) + // Mingw has similar problem with wxLogSysError: + #define WX_WATCOM_OR_MINGW_ONLY_CODE( x ) x +#else + #define WX_WATCOM_OR_MINGW_ONLY_CODE( x ) +#endif -#define DECLARE_LOG_FUNCTION_IMPL(level) \ - inline void wxVLog##level(const wxChar *WXUNUSED(szFormat), \ +// log functions do nothing at all +#define DECLARE_LOG_FUNCTION(level) \ + WX_DEFINE_VARARG_FUNC_NOP(wxLog##level, 1, (const wxString&)) \ + WX_WATCOM_ONLY_CODE( \ + WX_DEFINE_VARARG_FUNC_NOP(wxLog##level, 1, (const char*)) \ + WX_DEFINE_VARARG_FUNC_NOP(wxLog##level, 1, (const wchar_t*)) \ + WX_DEFINE_VARARG_FUNC_NOP(wxLog##level, 1, (const wxCStrData&)) \ + ) \ + inline void wxVLog##level(const wxString& WXUNUSED(format), \ va_list WXUNUSED(argptr)) { } \ -#define DECLARE_LOG_FUNCTION2_EXP_IMPL(level, argclass, arg, expdecl) \ +#define DECLARE_LOG_FUNCTION2_EXP(level, argclass, arg, expdecl) \ + WX_DEFINE_VARARG_FUNC_NOP(wxLog##level, 2, (argclass, const wxString&)) \ + WX_WATCOM_OR_MINGW_ONLY_CODE( \ + WX_DEFINE_VARARG_FUNC_NOP(wxLog##level, 2, (argclass, const char*)) \ + WX_DEFINE_VARARG_FUNC_NOP(wxLog##level, 2, (argclass, const wchar_t*)) \ + WX_DEFINE_VARARG_FUNC_NOP(wxLog##level, 2, (argclass, const wxCStrData&)) \ + ) \ inline void wxVLog##level(argclass WXUNUSED(arg), \ - const wxChar *WXUNUSED(szFormat), \ + const wxString& WXUNUSED(format), \ va_list WXUNUSED(argptr)) {} // Empty Class to fake wxLogNull @@ -521,24 +664,15 @@ public: #endif // wxUSE_LOG/!wxUSE_LOG -#define DECLARE_LOG_FUNCTION(level) \ - DECLARE_LOG_FUNCTION_PUBLIC(level) \ - DECLARE_LOG_FUNCTION_IMPL(level) - -#define DECLARE_LOG_FUNCTION2_EXP(level, argclass, arg, expdecl) \ - DECLARE_LOG_FUNCTION_PUBLIC(level) \ - DECLARE_LOG_FUNCTION2_EXP_IMPL(level, argclass, arg, expdecl) - -#define DECLARE_LOG_FUNCTION2_EXP(level, argclass, arg, expdecl) \ - DECLARE_LOG_FUNCTION_PUBLIC(level) \ - DECLARE_LOG_FUNCTION2_EXP_IMPL(level, argclass, arg, expdecl) - -#define DECLARE_LOG_FUNCTION2_IMPL(level, argclass, arg) \ - DECLARE_LOG_FUNCTION2_EXP_IMPL(level, argclass, arg, WXDLLIMPEXP_BASE) - #define DECLARE_LOG_FUNCTION2(level, argclass, arg) \ DECLARE_LOG_FUNCTION2_EXP(level, argclass, arg, WXDLLIMPEXP_BASE) +// VC6 produces a warning if we a macro expanding to nothing to +// DECLARE_LOG_FUNCTION2: +#if defined(__VISUALC__) && __VISUALC__ < 1300 + // "not enough actual parameters for macro 'DECLARE_LOG_FUNCTION2_EXP'" + #pragma warning(disable:4003) +#endif // a generic function for all levels (level is passes as parameter) DECLARE_LOG_FUNCTION2(Generic, wxLogLevel, level); @@ -553,26 +687,26 @@ DECLARE_LOG_FUNCTION(Verbose); // this function sends the log message to the status line of the top level // application frame, if any -DECLARE_LOG_FUNCTION_IMPL(Status); +DECLARE_LOG_FUNCTION(Status); #if wxUSE_GUI // this one is the same as previous except that it allows to explicitly - class WXDLLEXPORT wxFrame; + class WXDLLIMPEXP_FWD_CORE wxFrame; // specify the frame to which the output should go - DECLARE_LOG_FUNCTION2_EXP_IMPL(Status, wxFrame *, pFrame, WXDLLIMPEXP_CORE); + DECLARE_LOG_FUNCTION2_EXP(Status, wxFrame *, pFrame, WXDLLIMPEXP_CORE); #endif // wxUSE_GUI -DECLARE_LOG_FUNCTION_PUBLIC(Status); - // additional one: as wxLogError, but also logs last system call error code // and the corresponding error message if available -DECLARE_LOG_FUNCTION_IMPL(SysError); +DECLARE_LOG_FUNCTION(SysError); // and another one which also takes the error code (for those broken APIs // that don't set the errno (like registry APIs in Win32)) -DECLARE_LOG_FUNCTION2_IMPL(SysError, long, lErrCode); - -DECLARE_LOG_FUNCTION_PUBLIC(SysError); +DECLARE_LOG_FUNCTION2(SysError, long, lErrCode); +#ifdef __WATCOMC__ +// workaround for http://bugzilla.openwatcom.org/show_bug.cgi?id=351 +DECLARE_LOG_FUNCTION2(SysError, unsigned long, lErrCode); +#endif // debug functions do nothing in release mode #if wxUSE_LOG && wxUSE_LOG_DEBUG @@ -584,12 +718,21 @@ DECLARE_LOG_FUNCTION_PUBLIC(SysError); // this version only logs the message if the mask had been added to the // list of masks with AddTraceMask() - DECLARE_LOG_FUNCTION2_IMPL(Trace, const wxChar*, mask); + DECLARE_LOG_FUNCTION2(Trace, const wxString&, mask); +#ifdef __WATCOMC__ + // workaround for http://bugzilla.openwatcom.org/show_bug.cgi?id=351 + DECLARE_LOG_FUNCTION2(Trace, const char*, mask); + DECLARE_LOG_FUNCTION2(Trace, const wchar_t*, mask); +#endif + // and this one does nothing if all of level bits are not set in // wxLog::GetActive()->GetTraceMask() -- it's deprecated in favour of // string identifiers - DECLARE_LOG_FUNCTION2_IMPL(Trace, wxTraceMask, mask); - DECLARE_LOG_FUNCTION_PUBLIC(Trace); + DECLARE_LOG_FUNCTION2(Trace, wxTraceMask, mask); +#ifdef __WATCOMC__ + // workaround for http://bugzilla.openwatcom.org/show_bug.cgi?id=351 + DECLARE_LOG_FUNCTION2(Trace, int, mask); +#endif #else //!debug || !wxUSE_LOG // these functions do nothing in release builds, but don't define them as // nothing as it could result in different code structure in debug and @@ -613,13 +756,23 @@ DECLARE_LOG_FUNCTION_PUBLIC(SysError); #define wxLogTrace(mask, fmt, ...) wxLogNop() #else // !HAVE_VARIADIC_MACROS //inline void wxLogDebug(const wxString& fmt, ...) {} - WX_DEFINE_VARARG_FUNC_NOP(wxLogDebug) + WX_DEFINE_VARARG_FUNC_NOP(wxLogDebug, 1, (const wxString&)) //inline void wxLogTrace(wxTraceMask, const wxString& fmt, ...) {} //inline void wxLogTrace(const wxString&, const wxString& fmt, ...) {} - WX_DEFINE_VARARG_FUNC_NOP(wxLogTrace) + WX_DEFINE_VARARG_FUNC_NOP(wxLogTrace, 2, (wxTraceMask, const wxString&)) + WX_DEFINE_VARARG_FUNC_NOP(wxLogTrace, 2, (const wxString&, const wxString&)) + #ifdef __WATCOMC__ + // workaround for http://bugzilla.openwatcom.org/show_bug.cgi?id=351 + WX_DEFINE_VARARG_FUNC_NOP(wxLogTrace, 2, (const char*, const char*)) + WX_DEFINE_VARARG_FUNC_NOP(wxLogTrace, 2, (const wchar_t*, const wchar_t*)) + #endif #endif // HAVE_VARIADIC_MACROS/!HAVE_VARIADIC_MACROS #endif // debug/!debug +#if defined(__VISUALC__) && __VISUALC__ < 1300 + #pragma warning(default:4003) +#endif + // 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 WXDLLIMPEXP_BASE @@ -635,13 +788,13 @@ wxSafeShowMessage(const wxString& title, const wxString& text); #ifdef __VISUALC__ #define wxLogApiError(api, rc) \ wxLogDebug(wxT("%s(%d): '%s' failed with error 0x%08lx (%s)."), \ - __TFILE__, __LINE__, api, \ + __FILE__, __LINE__, api, \ (long)rc, wxSysErrorMsg(rc)) #else // !VC++ #define wxLogApiError(api, rc) \ wxLogDebug(wxT("In file %s at line %d: '%s' failed with ") \ wxT("error 0x%08lx (%s)."), \ - __TFILE__, __LINE__, api, \ + __FILE__, __LINE__, api, \ (long)rc, wxSysErrorMsg(rc)) #endif // VC++/!VC++ @@ -657,5 +810,9 @@ wxSafeShowMessage(const wxString& title, const wxString& text); #include "wx/cocoa/log.h" #endif +#ifdef WX_WATCOM_ONLY_CODE + #undef WX_WATCOM_ONLY_CODE +#endif + #endif // _WX_LOG_H_