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;