From d2e1ef1928b7a2a292a6a5b9bd6fa2402a0c6b0f Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Thu, 15 Jul 1999 15:45:50 +0000
Subject: [PATCH] 1. wxFFile::Close() buglet fixed 2. wxLogTextCtrl doesn't use
 streams any more

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3008 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 include/wx/log.h     | 30 ++++++++++++++++++++-----
 src/common/ffile.cpp |  2 +-
 src/common/log.cpp   | 53 ++++++++++++++++++++++++++++++++------------
 3 files changed, 65 insertions(+), 20 deletions(-)

diff --git a/include/wx/log.h b/include/wx/log.h
index 24292ae8d4..6a935070fc 100644
--- a/include/wx/log.h
+++ b/include/wx/log.h
@@ -153,6 +153,11 @@ public:
         // add string trace mask
     static void RemoveTraceMask(const wxString& str);
 
+        // sets the timestamp string: this is used as strftime() format string
+        // for the log targets which add time stamps to the messages - set it
+        // to NULL to disable time stamping completely.
+    static void SetTimestamp(const wxChar *ts) { ms_timestamp = ts; }
+
     // accessors
         // gets the verbose status
     bool GetVerbose() const { return m_bVerbose; }
@@ -162,6 +167,14 @@ public:
     static bool IsAllowedTraceMask(const wxChar *mask)
         { return ms_aTraceMasks.Index(mask) != wxNOT_FOUND; }
 
+        // get the current timestamp format string (may be NULL)
+    static const wxChar *GetTimestamp() { return ms_timestamp; }
+
+    // helpers
+        // put the time stamp into the string if ms_timestamp != NULL (don't
+        // change it otherwise)
+    static void TimeStamp(wxString *str);
+
     // make dtor virtual for all derived classes
     virtual ~wxLog() { }
 
@@ -185,6 +198,10 @@ private:
     static bool        ms_doLog;        // FALSE => all logging disabled
     static bool        ms_bAutoCreate;  // create new log targets on demand?
 
+    // format string for strftime(), if NULL, time stamping log messages is
+    // disabled
+    static const wxChar *ms_timestamp;
+
     static wxTraceMask ms_ulTraceMask;   // controls wxLogTrace behaviour
     static wxArrayString ms_aTraceMasks; // more powerful filter for wxLogTrace
 };
@@ -226,16 +243,19 @@ protected:
 
 #ifndef wxUSE_NOGUI
 
-#if wxUSE_STD_IOSTREAM
 // log everything to a text window (GUI only of course)
-class WXDLLEXPORT wxLogTextCtrl : public wxLogStream
+class WXDLLEXPORT wxLogTextCtrl : public wxLog
 {
 public:
-    // we just create an ostream from wxTextCtrl and use it in base class
     wxLogTextCtrl(wxTextCtrl *pTextCtrl);
-    ~wxLogTextCtrl();
+
+private:
+    // implement sink function
+    virtual void DoLogString(const wxChar *szString, time_t t);
+
+    // the control we use
+    wxTextCtrl *m_pTextCtrl;
 };
-#endif
 
 // ----------------------------------------------------------------------------
 // GUI log target, the default one for wxWindows programs
diff --git a/src/common/ffile.cpp b/src/common/ffile.cpp
index 4e1aea21ec..f880a43134 100644
--- a/src/common/ffile.cpp
+++ b/src/common/ffile.cpp
@@ -74,7 +74,7 @@ bool wxFFile::Close()
 {
     if ( IsOpened() )
     {
-        if ( !fclose(m_fp) )
+        if ( fclose(m_fp) != 0 )
         {
             wxLogSysError(_("can't close file '%s'"), m_name.c_str());
 
diff --git a/src/common/log.cpp b/src/common/log.cpp
index f9729d48d2..b71af7bd54 100644
--- a/src/common/log.cpp
+++ b/src/common/log.cpp
@@ -315,6 +315,20 @@ void wxLog::RemoveTraceMask(const wxString& str)
         ms_aTraceMasks.Remove((size_t)index);
 }
 
+void wxLog::TimeStamp(wxString *str)
+{
+    if ( ms_timestamp )
+    {
+        wxChar buf[256];
+        time_t timeNow;
+        (void)time(&timeNow);
+        wxStrftime(buf, WXSIZEOF(buf), ms_timestamp, localtime(&timeNow));
+
+        str->Empty();
+        *str << buf << _T(": ");
+    }
+}
+
 void wxLog::DoLog(wxLogLevel level, const wxChar *szString, time_t t)
 {
     switch ( level ) {
@@ -377,8 +391,9 @@ wxLogStderr::wxLogStderr(FILE *fp)
 
 void wxLogStderr::DoLogString(const wxChar *szString, time_t WXUNUSED(t))
 {
-    wxString str(szString);
-    str << _T('\n');
+    wxString str;
+    TimeStamp(&str);
+    str << szString << _T('\n');
 
     fputs(str.mb_str(), m_fp);
     fflush(m_fp);
@@ -415,19 +430,19 @@ void wxLogStream::DoLogString(const wxChar *szString, time_t WXUNUSED(t))
 // wxLogTextCtrl implementation
 // ----------------------------------------------------------------------------
 
-#if wxUSE_STD_IOSTREAM
 wxLogTextCtrl::wxLogTextCtrl(wxTextCtrl *pTextCtrl)
-#if !defined(NO_TEXT_WINDOW_STREAM)
-: wxLogStream(new ostream(pTextCtrl))
-#endif
 {
+    m_pTextCtrl = pTextCtrl;
 }
 
-wxLogTextCtrl::~wxLogTextCtrl()
+void wxLogTextCtrl::DoLogString(const wxChar *szString, time_t t)
 {
-    delete m_ostr;
+    wxString msg;
+    TimeStamp(&msg);
+    msg << szString << _T('\n');
+
+    m_pTextCtrl->AppendText(msg);
 }
-#endif // wxUSE_STD_IOSTREAM
 
 // ----------------------------------------------------------------------------
 // wxLogGui implementation (FIXME MT-unsafe)
@@ -533,12 +548,16 @@ void wxLogGui::DoLog(wxLogLevel level, const wxChar *szString, time_t t)
                     #ifdef __WXMSW__
                         // don't prepend debug/trace here: it goes to the
                         // debug window anyhow, but do put a timestamp
-                        OutputDebugString(wxString(szString) + _T("\n\r"));
+                        wxString str;
+                        TimeStamp(&str);
+                        str << szString << _T("\n\r");
+                        OutputDebugString(str);
                     #else
                         // send them to stderr
                         wxFprintf(stderr, _T("%s: %s\n"),
-                                level == wxLOG_Trace ? _T("Trace") : _T("Debug"),
-                                szString);
+                                  level == wxLOG_Trace ? _T("Trace")
+                                                       : _T("Debug"),
+                                  szString);
                         fflush(stderr);
                     #endif
                 }
@@ -832,8 +851,11 @@ void wxLogWindow::DoLogString(const wxChar *szString, time_t WXUNUSED(t))
     pText->SetSelection(nLen, nLen);
 #endif // Windows
 
-    pText->WriteText(szString);
-    pText->WriteText(_T("\n")); // "\n" ok here (_not_ "\r\n")
+    wxString msg;
+    TimeStamp(&msg);
+    msg << szString << _T('\n');
+
+    pText->AppendText(msg);
 
     // TODO ensure that the line can be seen
 }
@@ -873,6 +895,9 @@ wxLogWindow::~wxLogWindow()
 wxLog          *wxLog::ms_pLogger      = (wxLog *)NULL;
 bool            wxLog::ms_doLog        = TRUE;
 bool            wxLog::ms_bAutoCreate  = TRUE;
+
+const wxChar   *wxLog::ms_timestamp    = "%X";  // time only, no date
+
 wxTraceMask     wxLog::ms_ulTraceMask  = (wxTraceMask)0;
 wxArrayString   wxLog::ms_aTraceMasks;
 
-- 
2.47.2