X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b765da9f5090ef076302eb0d12cfc11b61296430..6012f61212b67d510e4a6393272e867a4ceb58c1:/src/common/log.cpp diff --git a/src/common/log.cpp b/src/common/log.cpp index d9a6c7eb30..e211345864 100644 --- a/src/common/log.cpp +++ b/src/common/log.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: log.cpp +// Name: src/common/log.cpp // Purpose: Assorted wxLogXXX functions, and wxLog (sink for logs) // Author: Vadim Zeitlin // Modified by: @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "log.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -32,19 +28,19 @@ // wxWidgets #ifndef WX_PRECOMP + #include "wx/log.h" #include "wx/app.h" #include "wx/arrstr.h" #include "wx/intl.h" #include "wx/string.h" + #include "wx/utils.h" #endif //WX_PRECOMP #include "wx/apptrait.h" #include "wx/file.h" -#include "wx/log.h" #include "wx/msgout.h" #include "wx/textfile.h" #include "wx/thread.h" -#include "wx/utils.h" #include "wx/wxchar.h" // other standard headers @@ -100,12 +96,6 @@ static wxCriticalSection gs_csLogBuf; #endif // wxUSE_THREADS -// return true if we have a non NULL non disabled log target -static inline bool IsLoggingEnabled() -{ - return wxLog::IsEnabled() && (wxLog::GetActiveTarget() != NULL); -} - // ---------------------------------------------------------------------------- // implementation of Log functions // @@ -114,7 +104,7 @@ static inline bool IsLoggingEnabled() // ---------------------------------------------------------------------------- // wrapper for wxVsnprintf(s_szBuf) which always NULL-terminates it -static inline void PrintfInLogBug(const wxChar *szFormat, va_list argptr) +static inline void PrintfInLogBuf(const wxChar *szFormat, va_list argptr) { if ( wxVsnprintf(s_szBuf, s_szBufSize, szFormat, argptr) < 0 ) { @@ -127,10 +117,10 @@ static inline void PrintfInLogBug(const wxChar *szFormat, va_list argptr) // generic log function void wxVLogGeneric(wxLogLevel level, const wxChar *szFormat, va_list argptr) { - if ( IsLoggingEnabled() ) { + if ( wxLog::IsEnabled() ) { wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); - PrintfInLogBug(szFormat, argptr); + PrintfInLogBuf(szFormat, argptr); wxLog::OnLog(level, s_szBuf, time(NULL)); } @@ -147,10 +137,10 @@ void wxLogGeneric(wxLogLevel level, const wxChar *szFormat, ...) #define IMPLEMENT_LOG_FUNCTION(level) \ void wxVLog##level(const wxChar *szFormat, va_list argptr) \ { \ - if ( IsLoggingEnabled() ) { \ + if ( wxLog::IsEnabled() ) { \ wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); \ \ - PrintfInLogBug(szFormat, argptr); \ + PrintfInLogBuf(szFormat, argptr); \ \ wxLog::OnLog(wxLOG_##level, s_szBuf, time(NULL)); \ } \ @@ -176,6 +166,7 @@ void wxSafeShowMessage(const wxString& title, const wxString& text) ::MessageBox(NULL, text, title, MB_OK | MB_ICONSTOP); #else wxFprintf(stderr, _T("%s: %s\n"), title.c_str(), text.c_str()); + fflush(stderr); #endif } @@ -208,9 +199,8 @@ void wxLogFatalError(const wxChar *szFormat, ...) // same as info, but only if 'verbose' mode is on void wxVLogVerbose(const wxChar *szFormat, va_list argptr) { - if ( IsLoggingEnabled() ) { - wxLog *pLog = wxLog::GetActiveTarget(); - if ( pLog != NULL && pLog->GetVerbose() ) { + if ( wxLog::IsEnabled() ) { + if ( wxLog::GetActiveTarget() != NULL && wxLog::GetVerbose() ) { wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); wxVsnprintf(s_szBuf, s_szBufSize, szFormat, argptr); @@ -233,7 +223,7 @@ void wxLogVerbose(const wxChar *szFormat, ...) #define IMPLEMENT_LOG_DEBUG_FUNCTION(level) \ void wxVLog##level(const wxChar *szFormat, va_list argptr) \ { \ - if ( IsLoggingEnabled() ) { \ + if ( wxLog::IsEnabled() ) { \ wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); \ \ wxVsnprintf(s_szBuf, s_szBufSize, szFormat, argptr); \ @@ -251,7 +241,7 @@ void wxLogVerbose(const wxChar *szFormat, ...) void wxVLogTrace(const wxChar *mask, const wxChar *szFormat, va_list argptr) { - if ( IsLoggingEnabled() && wxLog::IsAllowedTraceMask(mask) ) { + if ( wxLog::IsEnabled() && wxLog::IsAllowedTraceMask(mask) ) { wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); wxChar *p = s_szBuf; @@ -287,7 +277,7 @@ void wxLogVerbose(const wxChar *szFormat, ...) // we check that all of mask bits are set in the current mask, so // that wxLogTrace(wxTraceRefCount | wxTraceOle) will only do something // if both bits are set. - if ( IsLoggingEnabled() && ((wxLog::GetTraceMask() & mask) == mask) ) { + if ( wxLog::IsEnabled() && ((wxLog::GetTraceMask() & mask) == mask) ) { wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); wxVsnprintf(s_szBuf, s_szBufSize, szFormat, argptr); @@ -327,7 +317,7 @@ void wxLogSysErrorHelper(long lErrCode) void WXDLLEXPORT wxVLogSysError(const wxChar *szFormat, va_list argptr) { - if ( IsLoggingEnabled() ) { + if ( wxLog::IsEnabled() ) { wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); wxVsnprintf(s_szBuf, s_szBufSize, szFormat, argptr); @@ -346,7 +336,7 @@ void WXDLLEXPORT wxLogSysError(const wxChar *szFormat, ...) void WXDLLEXPORT wxVLogSysError(long lErrCode, const wxChar *szFormat, va_list argptr) { - if ( IsLoggingEnabled() ) { + if ( wxLog::IsEnabled() ) { wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); wxVsnprintf(s_szBuf, s_szBufSize, szFormat, argptr); @@ -367,10 +357,6 @@ void WXDLLEXPORT wxLogSysError(long lErrCode, const wxChar *szFormat, ...) // wxLog class implementation // ---------------------------------------------------------------------------- -wxLog::wxLog() -{ -} - wxChar *wxLog::SetLogBuffer( wxChar *buf, size_t size) { wxChar *oldbuf = s_szBuf; @@ -394,9 +380,9 @@ wxLog *wxLog::GetActiveTarget() if ( ms_bAutoCreate && ms_pLogger == NULL ) { // prevent infinite recursion if someone calls wxLogXXX() from // wxApp::CreateLogTarget() - static bool s_bInGetActiveTarget = FALSE; + static bool s_bInGetActiveTarget = false; if ( !s_bInGetActiveTarget ) { - s_bInGetActiveTarget = TRUE; + s_bInGetActiveTarget = true; // ask the application to create a log target for us if ( wxTheApp != NULL ) @@ -404,7 +390,7 @@ wxLog *wxLog::GetActiveTarget() else ms_pLogger = new wxLogStderr; - s_bInGetActiveTarget = FALSE; + s_bInGetActiveTarget = false; // do nothing if it fails - what can we do? } @@ -429,7 +415,7 @@ wxLog *wxLog::SetActiveTarget(wxLog *pLogger) void wxLog::DontCreateOnDemand() { - ms_bAutoCreate = FALSE; + ms_bAutoCreate = false; // this is usually called at the end of the program and we assume that it // is *always* called at the end - so we free memory here to avoid false @@ -527,6 +513,50 @@ void wxLog::Flush() return false; } +// ---------------------------------------------------------------------------- +// wxLogBuffer implementation +// ---------------------------------------------------------------------------- + +void wxLogBuffer::Flush() +{ + if ( !m_str.empty() ) + { + wxMessageOutputBest out; + out.Printf(_T("%s"), m_str.c_str()); + m_str.clear(); + } +} + +void wxLogBuffer::DoLog(wxLogLevel level, const wxChar *szString, time_t t) +{ + switch ( level ) + { + case wxLOG_Trace: + case wxLOG_Debug: +#ifdef __WXDEBUG__ + // don't put debug messages in the buffer, we don't want to show + // them to the user in a msg box, log them immediately + { + wxString str; + TimeStamp(&str); + str += szString; + + wxMessageOutputDebug dbgout; + dbgout.Printf(_T("%s\n"), str.c_str()); + } +#endif // __WXDEBUG__ + break; + + default: + wxLog::DoLog(level, szString, t); + } +} + +void wxLogBuffer::DoLogString(const wxChar *szString, time_t WXUNUSED(t)) +{ + m_str << szString << _T("\n"); +} + // ---------------------------------------------------------------------------- // wxLogStderr class implementation // ---------------------------------------------------------------------------- @@ -558,7 +588,8 @@ void wxLogStderr::DoLogString(const wxChar *szString, time_t WXUNUSED(t)) wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; if ( traits && !traits->HasStderr() ) { - wxMessageOutputDebug().Printf(_T("%s"), str.c_str()); + wxMessageOutputDebug dbgout; + dbgout.Printf(_T("%s\n"), str.c_str()); } } } @@ -581,7 +612,7 @@ void wxLogStream::DoLogString(const wxChar *szString, time_t WXUNUSED(t)) { wxString str; TimeStamp(&str); - (*m_ostr) << str << wxConvertWX2MB(szString) << wxSTD endl; + (*m_ostr) << wxConvertWX2MB(str) << wxConvertWX2MB(szString) << wxSTD endl; } #endif // wxUSE_STD_IOSTREAM @@ -591,7 +622,7 @@ void wxLogStream::DoLogString(const wxChar *szString, time_t WXUNUSED(t)) wxLogChain::wxLogChain(wxLog *logger) { - m_bPassMessages = TRUE; + m_bPassMessages = true; m_logNew = logger; m_logOld = wxLog::SetActiveTarget(this); @@ -666,9 +697,9 @@ wxLogPassThrough::wxLogPassThrough() // ---------------------------------------------------------------------------- wxLog *wxLog::ms_pLogger = (wxLog *)NULL; -bool wxLog::ms_doLog = TRUE; -bool wxLog::ms_bAutoCreate = TRUE; -bool wxLog::ms_bVerbose = FALSE; +bool wxLog::ms_doLog = true; +bool wxLog::ms_bAutoCreate = true; +bool wxLog::ms_bVerbose = false; wxLogLevel wxLog::ms_logLevel = wxLOG_Max; // log everything by default @@ -741,16 +772,29 @@ const wxChar *wxSysErrorMsg(unsigned long nErrCode) // get error message from system LPVOID lpMsgBuf; - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, nErrCode, + if ( ::FormatMessage + ( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + nErrCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, - 0, NULL); + 0, + NULL + ) == 0 ) + { + // if this happens, something is seriously wrong, so don't use _() here + // for safety + wxSprintf(s_szBuf, _T("unknown error %lx"), nErrCode); + return s_szBuf; + } + // copy it to our buffer and free memory - // Crashes on SmartPhone -#if !defined(__SMARTPHONE__) - if( lpMsgBuf != 0 ) { + // Crashes on SmartPhone (FIXME) +#if !defined(__SMARTPHONE__) /* of WinCE */ + if( lpMsgBuf != 0 ) + { wxStrncpy(s_szBuf, (const wxChar *)lpMsgBuf, WXSIZEOF(s_szBuf) - 1); s_szBuf[WXSIZEOF(s_szBuf) - 1] = wxT('\0'); @@ -784,4 +828,3 @@ const wxChar *wxSysErrorMsg(unsigned long nErrCode) } #endif // wxUSE_LOG -