]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/log.cpp
Rewrite wxExecute() implementation under Unix.
[wxWidgets.git] / src / common / log.cpp
index 8335dcfd17e023f041821179ea56e285f386c4b1..53ce213b5080316dacd55dd3efffa6ccd398a56a 100644 (file)
 
 #include <stdlib.h>
 
-#ifndef __WXPALMOS5__
 #ifndef __WXWINCE__
 #include <time.h>
 #else
 #include "wx/msw/wince/time.h"
 #endif
-#endif /* ! __WXPALMOS5__ */
 
 #if defined(__WINDOWS__)
     #include "wx/msw/private.h" // includes windows.h
@@ -204,6 +202,62 @@ void wxSafeShowMessage(const wxString& title, const wxString& text)
 #endif
 }
 
+// ----------------------------------------------------------------------------
+// wxLogFormatter class implementation
+// ----------------------------------------------------------------------------
+
+wxString
+wxLogFormatter::Format(wxLogLevel level,
+                       const wxString& msg,
+                       const wxLogRecordInfo& info) const
+{
+    wxString prefix;
+
+    // don't time stamp debug messages under MSW as debug viewers usually
+    // already have an option to do it
+#ifdef __WINDOWS__
+    if ( level != wxLOG_Debug && level != wxLOG_Trace )
+#endif // __WINDOWS__
+        prefix = FormatTime(info.timestamp);
+
+    switch ( level )
+    {
+    case wxLOG_Error:
+        prefix += _("Error: ");
+        break;
+
+    case wxLOG_Warning:
+        prefix += _("Warning: ");
+        break;
+
+        // don't prepend "debug/trace" prefix under MSW as it goes to the debug
+        // window anyhow and so can't be confused with something else
+#ifndef __WINDOWS__
+    case wxLOG_Debug:
+        // this prefix (as well as the one below) is intentionally not
+        // translated as nobody translates debug messages anyhow
+        prefix += "Debug: ";
+        break;
+
+    case wxLOG_Trace:
+        prefix += "Trace: ";
+        break;
+#endif // !__WINDOWS__
+    }
+
+    return prefix + msg;
+}
+
+wxString
+wxLogFormatter::FormatTime(time_t t) const
+{
+    wxString str;
+    wxLog::TimeStamp(&str, t);
+
+    return str;
+}
+
+
 // ----------------------------------------------------------------------------
 // wxLog class implementation
 // ----------------------------------------------------------------------------
@@ -252,11 +306,22 @@ wxLog::~wxLog()
     {
         wxMessageOutputDebug().Printf
         (
-            wxS("Last repeated message (\"%s\", %lu times) wasn't output"),
+#if wxUSE_INTL
+            wxPLURAL
+            (
+                "Last repeated message (\"%s\", %lu time) wasn't output",
+                "Last repeated message (\"%s\", %lu times) wasn't output",
+                gs_prevLog.numRepeated
+            ),
+#else
+            wxS("Last repeated message (\"%s\", %lu time(s)) wasn't output"),
+#endif
             gs_prevLog.msg,
             gs_prevLog.numRepeated
         );
     }
+
+    delete m_formatter;
 }
 
 // ----------------------------------------------------------------------------
@@ -288,11 +353,7 @@ wxLog::OnLog(wxLogLevel level,
     {
         wxSafeShowMessage(wxS("Fatal Error"), msg);
 
-#ifdef __WXWINCE__
-        ExitThread(3);
-#else
-        abort();
-#endif
+        wxAbort();
     }
 
     wxLog *logger;
@@ -395,47 +456,8 @@ void wxLog::DoLogRecord(wxLogLevel level,
     wxUnusedVar(info);
 #endif // WXWIN_COMPATIBILITY_2_8/!WXWIN_COMPATIBILITY_2_8
 
-
-    // TODO: it would be better to extract message formatting in a separate
-    //       wxLogFormatter class but for now we hard code formatting here
-
-    wxString prefix;
-
-    // don't time stamp debug messages under MSW as debug viewers usually
-    // already have an option to do it
-#ifdef __WXMSW__
-    if ( level != wxLOG_Debug && level != wxLOG_Trace )
-#endif // __WXMSW__
-        TimeStamp(&prefix);
-
-    // TODO: use the other wxLogRecordInfo fields
-
-    switch ( level )
-    {
-        case wxLOG_Error:
-            prefix += _("Error: ");
-            break;
-
-        case wxLOG_Warning:
-            prefix += _("Warning: ");
-            break;
-
-        // don't prepend "debug/trace" prefix under MSW as it goes to the debug
-        // window anyhow and so can't be confused with something else
-#ifndef __WXMSW__
-        case wxLOG_Debug:
-            // this prefix (as well as the one below) is intentionally not
-            // translated as nobody translates debug messages anyhow
-            prefix += "Debug: ";
-            break;
-
-        case wxLOG_Trace:
-            prefix += "Trace: ";
-            break;
-#endif // !__WXMSW__
-    }
-
-    DoLogTextAtLevel(level, prefix + msg);
+    // Use wxLogFormatter to format the message
+    DoLogTextAtLevel(level, m_formatter->Format (level, msg, info));
 }
 
 void wxLog::DoLogTextAtLevel(wxLogLevel level, const wxString& msg)
@@ -683,17 +705,38 @@ void wxLog::ClearTraceMasks()
 // wxLog miscellaneous other methods
 // ----------------------------------------------------------------------------
 
+#if wxUSE_DATETIME
+
 void wxLog::TimeStamp(wxString *str)
 {
-#if wxUSE_DATETIME
     if ( !ms_timestamp.empty() )
     {
         *str = wxDateTime::UNow().Format(ms_timestamp);
         *str += wxS(": ");
     }
-#endif // wxUSE_DATETIME
 }
 
+void wxLog::TimeStamp(wxString *str, time_t t)
+{
+    if ( !ms_timestamp.empty() )
+    {
+        *str = wxDateTime(t).Format(ms_timestamp);
+        *str += wxS(": ");
+    }
+}
+
+#else // !wxUSE_DATETIME
+
+void wxLog::TimeStamp(wxString*)
+{
+}
+
+void wxLog::TimeStamp(wxString*, time_t)
+{
+}
+
+#endif // wxUSE_DATETIME/!wxUSE_DATETIME
+
 #if wxUSE_THREADS
 
 void wxLog::FlushThreadMessages()
@@ -736,6 +779,14 @@ bool wxLog::EnableThreadLogging(bool enable)
 
 #endif // wxUSE_THREADS
 
+wxLogFormatter *wxLog::SetFormatter(wxLogFormatter* formatter)
+{
+    wxLogFormatter* formatterOld = m_formatter;
+    m_formatter = formatter ? formatter : new wxLogFormatter;
+
+    return formatterOld;
+}
+
 void wxLog::Flush()
 {
     LogLastRepeatIfNeeded();
@@ -851,7 +902,14 @@ wxLogChain::wxLogChain(wxLog *logger)
     m_bPassMessages = true;
 
     m_logNew = logger;
-    m_logOld = wxLog::SetActiveTarget(this);
+
+    // Notice that we use GetActiveTarget() here instead of directly calling
+    // SetActiveTarget() to trigger wxLog auto-creation: if we're created as
+    // the first logger, we should still chain with the standard, implicit and
+    // possibly still not created standard logger instead of disabling normal
+    // logging entirely.
+    m_logOld = wxLog::GetActiveTarget();
+    wxLog::SetActiveTarget(this);
 }
 
 wxLogChain::~wxLogChain()
@@ -997,7 +1055,7 @@ static void wxLogWrap(FILE *f, const char *pszPrefix, const char *psz)
 // get error code from syste
 unsigned long wxSysErrorCode()
 {
-#if defined(__WXMSW__) && !defined(__WXMICROWIN__)
+#if defined(__WINDOWS__) && !defined(__WXMICROWIN__)
     return ::GetLastError();
 #else   //Unix
     return errno;
@@ -1010,7 +1068,7 @@ const wxChar *wxSysErrorMsg(unsigned long nErrCode)
     if ( nErrCode == 0 )
         nErrCode = wxSysErrorCode();
 
-#if defined(__WXMSW__) && !defined(__WXMICROWIN__)
+#if defined(__WINDOWS__) && !defined(__WXMICROWIN__)
     static wxChar s_szBuf[1024];
 
     // get error message from system
@@ -1058,7 +1116,7 @@ const wxChar *wxSysErrorMsg(unsigned long nErrCode)
     }
 
     return s_szBuf;
-#else // !__WXMSW__
+#else // !__WINDOWS__
     #if wxUSE_UNICODE
         static wchar_t s_wzBuf[1024];
         wxConvCurrent->MB2WC(s_wzBuf, strerror((int)nErrCode),
@@ -1067,7 +1125,7 @@ const wxChar *wxSysErrorMsg(unsigned long nErrCode)
     #else
         return strerror((int)nErrCode);
     #endif
-#endif  // __WXMSW__/!__WXMSW__
+#endif  // __WINDOWS__/!__WINDOWS__
 }
 
 #endif // wxUSE_LOG