void wxLog::CallDoLogNow(wxLogLevel level, const wxString& msg, const wxLogRecordInfo& info) { if ( GetRepetitionCounting() ) { if ( msg == gs_prevLog.msg ) { gs_prevLog.numRepeated++; // nothing else to do, in particular, don't log the // repeated message return; } LogLastRepeatIfNeeded(); // reset repetition counter for a new message gs_prevLog.msg = msg; gs_prevLog.level = level; gs_prevLog.info = info; } // handle extra data which may be passed to us by wxLogXXX() wxString prefix, suffix; wxUIntPtr num = 0; if ( info.GetNumValue(wxLOG_KEY_SYS_ERROR_CODE, &num) ) { const long err = static_cast<long>(num); suffix.Printf(_(" (error %ld: %s)"), err, wxSysErrorMsg(err)); } #if wxUSE_LOG_TRACE wxString str; if ( level == wxLOG_Trace && info.GetStrValue(wxLOG_KEY_TRACE_MASK, &str) ) { prefix = "(" + str + ") "; } #endif // wxUSE_LOG_TRACE DoLogRecord(level, prefix + msg + suffix, info); }
// log all kinds of messages void wxLogGui::DoLogRecord(wxLogLevel level, const wxString& msg, const wxLogRecordInfo& info) { switch ( level ) { case wxLOG_Info: case wxLOG_Message: { m_aMessages.Add(msg); m_aSeverity.Add(wxLOG_Message); m_aTimes.Add((long)info.timestamp); m_bHasMessages = true; } break; case wxLOG_Status: #if wxUSE_STATUSBAR { wxFrame *pFrame = NULL; // check if the frame was passed to us explicitly wxUIntPtr ptr = 0; if ( info.GetNumValue(wxLOG_KEY_FRAME, &ptr) ) { pFrame = static_cast<wxFrame *>(wxUIntToPtr(ptr)); } // find the top window and set it's status text if it has any if ( pFrame == NULL ) { wxWindow *pWin = wxTheApp->GetTopWindow(); if ( wxDynamicCast(pWin, wxFrame) ) { pFrame = (wxFrame *)pWin; } } if ( pFrame && pFrame->GetStatusBar() ) pFrame->SetStatusText(msg); } #endif // wxUSE_STATUSBAR break; case wxLOG_Error: if ( !m_bErrors ) { #if !wxUSE_LOG_DIALOG // discard earlier informational messages if this is the 1st // error because they might not make sense any more and showing // them in a message box might be confusing m_aMessages.Empty(); m_aSeverity.Empty(); m_aTimes.Empty(); #endif // wxUSE_LOG_DIALOG m_bErrors = true; } wxFALLTHROUGH; case wxLOG_Warning: if ( !m_bErrors ) { // for the warning we don't discard the info messages m_bWarnings = true; } m_aMessages.Add(msg); m_aSeverity.Add((int)level); m_aTimes.Add((long)info.timestamp); m_bHasMessages = true; break; case wxLOG_Debug: case wxLOG_Trace: // let the base class deal with debug/trace messages wxLog::DoLogRecord(level, msg, info); break; case wxLOG_FatalError: case wxLOG_Max: // fatal errors are shown immediately and terminate the program so // we should never see them here wxFAIL_MSG("unexpected log level"); break; case wxLOG_Progress: case wxLOG_User: // just ignore those: passing them to the base class would result // in asserts from DoLogText() because DoLogTextAtLevel() would // call it as it doesn't know how to handle these levels otherwise break; } }