X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/884d770ab530ad81943366cd6c1588d9c0602b38..7b124d5404c31d9462da3ea587a7f4d3d0dce41e:/src/common/log.cpp diff --git a/src/common/log.cpp b/src/common/log.cpp index 5f9ac6c643..cbcaf76630 100644 --- a/src/common/log.cpp +++ b/src/common/log.cpp @@ -47,11 +47,11 @@ #include #include -// _WINDOWS_ is defined when windows.h is included, -// __WINDOWS__ is defined for MS Windows compilation -#if defined(__WINDOWS__) && !defined(_WINDOWS_) +#ifdef __WXMSW__ #include -#endif //windows.h +#else //Unix + #include +#endif //Win/Unix // ---------------------------------------------------------------------------- // non member functions @@ -83,12 +83,12 @@ static char s_szBuf[LOG_BUFFER_SIZE]; // generic log function -void wxLogGeneric(wxLogLevel level, wxTString strFormat, ...) +void wxLogGeneric(wxLogLevel level, const char *szFormat, ...) { if ( wxLog::GetActiveTarget() != NULL ) { va_list argptr; - va_start(argptr, strFormat); - vsprintf(s_szBuf, strFormat, argptr); + va_start(argptr, szFormat); + vsprintf(s_szBuf, szFormat, argptr); va_end(argptr); wxLog::OnLog(level, s_szBuf); @@ -96,12 +96,12 @@ void wxLogGeneric(wxLogLevel level, wxTString strFormat, ...) } #define IMPLEMENT_LOG_FUNCTION(level) \ - void wxLog##level(wxTString strFormat, ...) \ + void wxLog##level(const char *szFormat, ...) \ { \ if ( wxLog::GetActiveTarget() != NULL ) { \ va_list argptr; \ - va_start(argptr, strFormat); \ - vsprintf(s_szBuf, strFormat, argptr); \ + va_start(argptr, szFormat); \ + vsprintf(s_szBuf, szFormat, argptr); \ va_end(argptr); \ \ wxLog::OnLog(wxLOG_##level, s_szBuf); \ @@ -116,13 +116,13 @@ IMPLEMENT_LOG_FUNCTION(Info) IMPLEMENT_LOG_FUNCTION(Status) // same as info, but only if 'verbose' mode is on -void wxLogVerbose(wxTString strFormat, ...) +void wxLogVerbose(const char *szFormat, ...) { wxLog *pLog = wxLog::GetActiveTarget(); if ( pLog != NULL && pLog->GetVerbose() ) { va_list argptr; - va_start(argptr, strFormat); - vsprintf(s_szBuf, strFormat, argptr); + va_start(argptr, szFormat); + vsprintf(s_szBuf, szFormat, argptr); va_end(argptr); wxLog::OnLog(wxLOG_Info, s_szBuf); @@ -130,7 +130,7 @@ void wxLogVerbose(wxTString strFormat, ...) } // debug functions -#ifdef __DEBUG__ +#ifdef __WXDEBUG__ #define IMPLEMENT_LOG_DEBUG_FUNCTION(level) \ void wxLog##level(const char *szFormat, ...) \ { \ @@ -181,21 +181,21 @@ void wxLogSysErrorHelper(long lErrCode) wxLog::OnLog(wxLOG_Error, s_szBuf); } -void WXDLLEXPORT wxLogSysError(wxTString strFormat, ...) +void WXDLLEXPORT wxLogSysError(const char *szFormat, ...) { va_list argptr; - va_start(argptr, strFormat); - vsprintf(s_szBuf, strFormat, argptr); + va_start(argptr, szFormat); + vsprintf(s_szBuf, szFormat, argptr); va_end(argptr); wxLogSysErrorHelper(wxSysErrorCode()); } -void WXDLLEXPORT wxLogSysError(long lErrCode, wxTString strFormat, ...) +void WXDLLEXPORT wxLogSysError(long lErrCode, const char *szFormat, ...) { va_list argptr; - va_start(argptr, strFormat); - vsprintf(s_szBuf, strFormat, argptr); + va_start(argptr, szFormat); + vsprintf(s_szBuf, szFormat, argptr); va_end(argptr); wxLogSysErrorHelper(lErrCode); @@ -210,11 +210,11 @@ wxLog::wxLog() m_bHasMessages = FALSE; m_bVerbose = FALSE; m_szTimeFormat = "[%d/%b/%y %H:%M:%S] "; - m_ulTraceMask = (wxTraceMask)-1; // set all bits + m_ulTraceMask = (wxTraceMask)0; // -1 to set all bits } -wxLog *wxLog::GetActiveTarget() -{ +wxLog *wxLog::GetActiveTarget() +{ if ( !ms_bInitialized ) { // prevent infinite recursion if someone calls wxLogXXX() from // wxApp::CreateLogTarget() @@ -230,20 +230,20 @@ wxLog *wxLog::GetActiveTarget() // do nothing if it fails - what can we do? } - return ms_pLogger; + return ms_pLogger; } wxLog *wxLog::SetActiveTarget(wxLog *pLogger) -{ +{ // flush the old messages before changing if ( ms_pLogger != NULL ) ms_pLogger->Flush(); ms_bInitialized = TRUE; - wxLog *pOldLogger = ms_pLogger; - ms_pLogger = pLogger; - return pOldLogger; + wxLog *pOldLogger = ms_pLogger; + ms_pLogger = pLogger; + return pOldLogger; } void wxLog::DoLog(wxLogLevel level, const char *szString) @@ -291,16 +291,16 @@ void wxLog::DoLog(wxLogLevel level, const char *szString) case wxLOG_Trace: case wxLOG_Debug: - #ifdef __DEBUG__ + #ifdef __WXDEBUG__ #ifdef __WIN32__ // in addition to normal logging, also send the string to debugger // (don't prepend "Debug" here: it will go to debug window anyhow) ::OutputDebugString(str + szString + "\n\r"); #endif //Win32 - DoLogString(str << (level == wxLOG_Trace ? "Trace" : "Debug") + DoLogString(str << (level == wxLOG_Trace ? _("Trace") : _("Debug")) << ": " << szString); #endif - + break; default: @@ -308,7 +308,7 @@ void wxLog::DoLog(wxLogLevel level, const char *szString) } } -void wxLog::DoLogString(const char *szString) +void wxLog::DoLogString(const char *WXUNUSED(szString)) { wxFAIL_MSG("DoLogString must be overrided if it's called."); } @@ -359,7 +359,7 @@ void wxLogStream::DoLogString(const char *szString) // ---------------------------------------------------------------------------- wxLogTextCtrl::wxLogTextCtrl(wxTextCtrl *pTextCtrl) // @@@ TODO: in wxGTK wxTextCtrl doesn't derive from streambuf -#ifndef __GTK__ +#ifndef __WXGTK__ : wxLogStream(new ostream(pTextCtrl)) #endif //GTK { @@ -367,7 +367,7 @@ wxLogTextCtrl::wxLogTextCtrl(wxTextCtrl *pTextCtrl) wxLogTextCtrl::~wxLogTextCtrl() { - #ifndef __GTK__ + #ifndef __WXGTK__ delete m_ostr; #endif //GTK } @@ -389,10 +389,10 @@ void wxLogGui::Flush() return; // @@@ ugly... - + // concatenate all strings (but not too many to not overfill the msg box) wxString str; - uint nLines = 0, + uint nLines = 0, nMsgCount = m_aMessages.Count(); // start from the most recent message @@ -448,14 +448,14 @@ void wxLogGui::DoLog(wxLogLevel level, const char *szString) case wxLOG_Trace: case wxLOG_Debug: - #ifdef __DEBUG__ + #ifdef __WXDEBUG__ #ifdef __WIN32__ OutputDebugString(szString); OutputDebugString("\n\r"); #else //!WIN32 // send them to stderr - fprintf(stderr, level == wxLOG_Trace ? "Trace: %s\n" - : "Debug: %s\n", szString); + fprintf(stderr, "%s: %s\n", + level == wxLOG_Trace ? _("Trace") : _("Debug"), szString); fflush(stderr); #endif // WIN32 #endif @@ -463,7 +463,7 @@ void wxLogGui::DoLog(wxLogLevel level, const char *szString) case wxLOG_FatalError: // show this one immediately - wxMessageBox(szString, "Fatal error", wxICON_HAND); + wxMessageBox(szString, _("Fatal error"), wxICON_HAND); break; case wxLOG_Error: @@ -477,7 +477,7 @@ void wxLogGui::DoLog(wxLogLevel level, const char *szString) m_aMessages.Add(szString); break; - + default: wxFAIL_MSG("unknown log level in wxLogGui::DoLog"); } @@ -496,6 +496,7 @@ public: // menu callbacks void OnClose(wxCommandEvent& event); + void OnCloseWindow(wxCloseEvent& event); void OnSave (wxCommandEvent& event); void OnClear(wxCommandEvent& event); @@ -521,12 +522,16 @@ BEGIN_EVENT_TABLE(wxLogFrame, wxFrame) EVT_MENU(Menu_Save, wxLogFrame::OnSave) EVT_MENU(Menu_Clear, wxLogFrame::OnClear) - EVT_CLOSE(wxLogFrame::OnClose) -END_EVENT_TABLE() + EVT_CLOSE(wxLogFrame::OnCloseWindow) +END_EVENT_TABLE() wxLogFrame::wxLogFrame(const char *szTitle) : wxFrame(NULL, -1, szTitle) { + // we don't want to be a top-level frame because it would prevent the + // application termination when all other frames are closed + wxTopLevelWindows.DeleteObject(this); + // @@ kludge: wxSIMPLE_BORDER is simply to prevent wxWindows from creating // a rich edit control instead of a normal one we want m_pTextCtrl = new wxTextCtrl(this, -1, wxEmptyString, wxDefaultPosition, @@ -553,13 +558,19 @@ wxLogFrame::wxLogFrame(const char *szTitle) // @@ what about status bar? needed (for menu prompts)? } -void wxLogFrame::OnClose(wxCommandEvent& event) +void wxLogFrame::OnClose(wxCommandEvent& WXUNUSED(event)) +{ + // just hide the window + Show(FALSE); +} + +void wxLogFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) { // just hide the window Show(FALSE); } -void wxLogFrame::OnSave(wxCommandEvent& event) +void wxLogFrame::OnSave(wxCommandEvent& WXUNUSED(event)) { // get the file name // ----------------- @@ -572,9 +583,9 @@ void wxLogFrame::OnSave(wxCommandEvent& event) // open file // --------- wxFile file; - Bool bOk; + bool bOk = FALSE; if ( wxFile::Exists(szFileName) ) { - Bool bAppend; + bool bAppend = FALSE; wxString strMsg; strMsg.Printf(_("Append log to file '%s' " "(choosing [No] will overwrite it)?"), szFileName); @@ -607,36 +618,40 @@ void wxLogFrame::OnSave(wxCommandEvent& event) // retrieve text and save it // ------------------------- - +#ifdef __WXGTK__ // @@@@ TODO: no GetNumberOfLines and GetLineText in wxGTK yet -#ifndef __GTK__ + wxLogError("Sorry, this function is not implemented under GTK"); +#else int nLines = m_pTextCtrl->GetNumberOfLines(); for ( int nLine = 0; bOk && nLine < nLines; nLine++ ) { bOk = file.Write(m_pTextCtrl->GetLineText(nLine) + wxTextFile::GetEOL()); } #endif //GTK - + if ( bOk ) bOk = file.Close(); if ( !bOk ) { - wxLogError("Can't save log contents to file."); + wxLogError(_("Can't save log contents to file.")); return; } } -void wxLogFrame::OnClear(wxCommandEvent& event) +void wxLogFrame::OnClear(wxCommandEvent& WXUNUSED(event)) { m_pTextCtrl->Clear(); } -wxLogWindow::wxLogWindow(const wxTString& strTitle) +wxLogWindow::wxLogWindow(const char *szTitle, bool bShow) { m_pOldLog = wxLog::GetActiveTarget(); - m_pLogFrame = new wxLogFrame(strTitle); + m_pLogFrame = new wxLogFrame(szTitle); + + if ( bShow ) + m_pLogFrame->Show(TRUE); } -void wxLogWindow::Show(Bool bShow) +void wxLogWindow::Show(bool bShow) { m_pLogFrame->Show(bShow); } @@ -645,13 +660,13 @@ void wxLogWindow::DoLog(wxLogLevel level, const char *szString) { // first let the previous logger show it if ( m_pOldLog != NULL ) { - // @@@ why can't we access protected wxLog method from here (we derive + // @@@ why can't we access protected wxLog method from here (we derive // from wxLog)? gcc gives "DoLog is protected in this context", what // does this mean? Anyhow, the cast is harmless and let's us do what // we want. ((wxLogWindow *)m_pOldLog)->DoLog(level, szString); } - + // and this will format it nicely and call our DoLogString() wxLog::DoLog(level, szString); } @@ -662,8 +677,10 @@ void wxLogWindow::DoLogString(const char *szString) wxTextCtrl *pText = m_pLogFrame->TextCtrl(); // remove selection (WriteText is in fact ReplaceSelection) - long nLen = pText->GetLastPosition(); - pText->SetSelection(nLen, nLen); + #ifdef __WXMSW__ + long nLen = pText->GetLastPosition(); + pText->SetSelection(nLen, nLen); + #endif // Windows pText->WriteText(szString); pText->WriteText("\n"); // "\n" ok here (_not_ "\r\n") @@ -733,7 +750,7 @@ static void wxLogWrap(FILE *f, const char *pszPrefix, const char *psz) // get error code from syste unsigned long wxSysErrorCode() { - #ifdef __WINDOWS__ + #ifdef __WXMSW__ #ifdef __WIN32__ return ::GetLastError(); #else //WIN16 @@ -751,14 +768,14 @@ const char *wxSysErrorMsg(unsigned long nErrCode) if ( nErrCode == 0 ) nErrCode = wxSysErrorCode(); - #ifdef __WINDOWS__ + #ifdef __WXMSW__ #ifdef __WIN32__ static char s_szBuf[LOG_BUFFER_SIZE / 2]; // get error message from system LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, nErrCode, + NULL, nErrCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL); @@ -791,13 +808,30 @@ const char *wxSysErrorMsg(unsigned long nErrCode) // debug helper // ---------------------------------------------------------------------------- -#ifdef __DEBUG__ +#ifdef __WXDEBUG__ + +void Trap() +{ + #ifdef __WXMSW__ + DebugBreak(); + #else // Unix + raise(SIGTRAP); + #endif // Win/Unix +} // this function is called when an assert fails void wxOnAssert(const char *szFile, int nLine, const char *szMsg) { // this variable can be set to true to suppress "assert failure" messages - static s_bNoAsserts = FALSE; + static bool s_bNoAsserts = FALSE; + static bool s_bInAssert = FALSE; + + if ( s_bInAssert ) { + // He-e-e-e-elp!! we're trapped in endless loop + Trap(); + } + + s_bInAssert = TRUE; char szBuf[LOG_BUFFER_SIZE]; sprintf(szBuf, _("Assert failed in file %s at line %d"), szFile, nLine); @@ -809,32 +843,30 @@ void wxOnAssert(const char *szFile, int nLine, const char *szMsg) strcat(szBuf, "."); } - // send it to the normal log destination - wxLogDebug(szBuf); + if ( !s_bNoAsserts ) { + // send it to the normal log destination + wxLogDebug(szBuf); - #ifdef __WINDOWS__ - if ( !s_bNoAsserts ) { - strcat(szBuf, _("\nDo you want to stop the program?" - "\nYou can also choose [Cancel] to suppress " - "further warnings.")); + strcat(szBuf, _("\nDo you want to stop the program?" + "\nYou can also choose [Cancel] to suppress " + "further warnings.")); - switch ( ::MessageBox(NULL, szBuf, _("Debug"), - MB_YESNOCANCEL | MB_ICONINFORMATION) ) { - case IDYES: - DebugBreak(); - break; + switch ( wxMessageBox(szBuf, _("Debug"), + wxYES_NO | wxCANCEL | wxICON_STOP ) ) { + case wxYES: + Trap(); + break; - case IDCANCEL: - s_bNoAsserts = TRUE; - break; - } + case wxCANCEL: + s_bNoAsserts = TRUE; + break; + + //case wxNO: nothing to do } - #else // !Windows - // @@@@ don't know how to start the debugger under generic Unix - s_bNoAsserts = TRUE; // suppress 'unused var' warning - abort(); - #endif // Windows/!Windows + } + + s_bInAssert = FALSE; } -#endif //DEBUG +#endif //WXDEBUG