+ // 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);
+}
+
+void wxLog::DoLogRecord(wxLogLevel level,
+ const wxString& msg,
+ const wxLogRecordInfo& info)
+{
+#if WXWIN_COMPATIBILITY_2_8
+ // call the old DoLog() to ensure that existing custom log classes still
+ // work
+ //
+ // as the user code could have defined it as either taking "const char *"
+ // (in ANSI build) or "const wxChar *" (in ANSI/Unicode), we have no choice
+ // but to call both of them
+ DoLog(level, (const char*)msg.mb_str(), info.timestamp);
+ DoLog(level, (const wchar_t*)msg.wc_str(), info.timestamp);
+#else // !WXWIN_COMPATIBILITY_2_8
+ wxUnusedVar(info);
+#endif // WXWIN_COMPATIBILITY_2_8/!WXWIN_COMPATIBILITY_2_8
+
+ // Use wxLogFormatter to format the message
+ DoLogTextAtLevel(level, m_formatter->Format (level, msg, info));
+}
+
+void wxLog::DoLogTextAtLevel(wxLogLevel level, const wxString& msg)
+{
+ // we know about debug messages (because using wxMessageOutputDebug is the
+ // right thing to do in 99% of all cases and also for compatibility) but
+ // anything else needs to be handled in the derived class
+ if ( level == wxLOG_Debug || level == wxLOG_Trace )
+ {
+ wxMessageOutputDebug().Output(msg + wxS('\n'));
+ }
+ else
+ {
+ DoLogText(msg);
+ }
+}
+
+void wxLog::DoLogText(const wxString& WXUNUSED(msg))
+{
+ // in 2.8-compatible build the derived class might override DoLog() or
+ // DoLogString() instead so we can't have this assert there
+#if !WXWIN_COMPATIBILITY_2_8
+ wxFAIL_MSG( "must be overridden if it is called" );
+#endif // WXWIN_COMPATIBILITY_2_8
+}
+
+#if WXWIN_COMPATIBILITY_2_8
+
+void wxLog::DoLog(wxLogLevel WXUNUSED(level), const char *szString, time_t t)
+{
+ DoLogString(szString, t);
+}
+
+void wxLog::DoLog(wxLogLevel WXUNUSED(level), const wchar_t *wzString, time_t t)