From 47fe7ff3821c632b490b16da6b5113f127905a23 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Thu, 21 Jun 2007 12:44:38 +0000 Subject: [PATCH] Added DetachOldLog to avoid destruction of old log target Renamed wxLogPassThrough to wxLogInterposer Added wxLogInterposerTemp git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46580 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/latex/wx/log.tex | 49 ++++++++++++++++++++++++++++++++++++------ docs/latex/wx/tlog.tex | 7 +++--- include/wx/log.h | 24 ++++++++++++++++++--- src/common/log.cpp | 20 ++++++++++++----- 4 files changed, 82 insertions(+), 18 deletions(-) diff --git a/docs/latex/wx/log.tex b/docs/latex/wx/log.tex index 41fd6f6700..ae311235b4 100644 --- a/docs/latex/wx/log.tex +++ b/docs/latex/wx/log.tex @@ -434,6 +434,13 @@ target but the log messages are also passed to the previous log target if any. Destroys the previous log target. +\membersection{wxLogChain::DetachOldLog}\label{wxlogchaindetacholdlog} + +\func{void}{DetachOldLog}{\void} + +Detaches the old log target so it won't be destroyed when the wxLogChain object +is destroyed. + \membersection{wxLogChain::GetOldLog}\label{wxlogchaingetoldlog} \constfunc{wxLog *}{GetOldLog}{\void} @@ -564,19 +571,47 @@ Suspends logging. Resumes logging. -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wxLogPassThrough %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wxLogInterposer %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\section{\class{wxLogPassThrough}}\label{wxlogpassthrough} +\section{\class{wxLogInterposer}}\label{wxloginterposer} A special version of \helpref{wxLogChain}{wxlogchain} which uses itself as the -new log target. Maybe more clearly, it means that this is a log target which -forwards the log messages to the previously installed one in addition to +new log target. It forwards log messages to the previously installed one in addition to processing them itself. Unlike \helpref{wxLogChain}{wxlogchain} which is usually used directly as is, this class must be derived from to implement \helpref{DoLog}{wxlogdolog} and/or \helpref{DoLogString}{wxlogdologstring} methods. +wxLogInterposer destroys the previous log target in its destructor. If you +don't want this to happen, use wxLogInterposerTemp instead. + +\wxheading{Derived from} + +\helpref{wxLogChain}{wxlogchain} + +\wxheading{Include files} + + + +\latexignore{\rtfignore{\wxheading{Members}}} + +\membersection{wxLogInterposer::wxLogInterposer}\label{wxloginterposerctor} + +The default constructor installs this object as the current active log target. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wxLogInterposerTemp %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section{\class{wxLogInterposerTemp}}\label{wxloginterposertemp} + +A special version of \helpref{wxLogChain}{wxlogchain} which uses itself as the +new log target. It forwards log messages to the previously installed one in addition to +processing them itself. Unlike \helpref{wxLogInterposer}{wxloginterposer}, it doesn't +delete the old target which means it can be used to temporarily redirect log output. + +As per wxLogInterposer, this class must be derived from to implement \helpref{DoLog}{wxlogdolog} +and/or \helpref{DoLogString}{wxlogdologstring} methods. + \wxheading{Derived from} \helpref{wxLogChain}{wxlogchain} @@ -587,9 +622,9 @@ and/or \helpref{DoLogString}{wxlogdologstring} methods. \latexignore{\rtfignore{\wxheading{Members}}} -\membersection{wxLogPassThrough::wxLogPassThrough}\label{wxlogpassthroughctor} +\membersection{wxLogInterposerTemp::wxLogInterposerTemp}\label{wxloginterposertempctor} -Default ctor installs this object as the current active log target. +The default constructor installs this object as the current active log target. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wxLogStderr %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -693,7 +728,7 @@ them normally by showing the standard log dialog. \wxheading{Derived from} -\helpref{wxLogPassThrough}{wxlogpassthrough} +\helpref{wxLogInterposer}{wxloginterposer} \wxheading{Include files} diff --git a/docs/latex/wx/tlog.tex b/docs/latex/wx/tlog.tex index 713757d6ca..f195d43ede 100644 --- a/docs/latex/wx/tlog.tex +++ b/docs/latex/wx/tlog.tex @@ -8,7 +8,8 @@ Classes: \helpref{wxLog}{wxlog},\\ \helpref{wxLogGui}{wxloggui},\\ \helpref{wxLogNull}{wxlognull},\\ \helpref{wxLogChain}{wxlogchain},\\ -\helpref{wxLogPassThrough}{wxlogpassthrough},\\ +\helpref{wxLogInterposer}{wxloginterposer},\\ +\helpref{wxLogInterposerTemp}{wxloginterposertemp},\\ \helpref{wxStreamToTextRedirector}{wxstreamtotextredirector} This is a general overview of logging classes provided by wxWidgets. The word @@ -166,6 +167,6 @@ reasons it is unwanted, just use this construction: The log targets can also be combined: for example you may wish to redirect the messages somewhere else (for example, to a log file) but also process them as -normally. For this the \helpref{wxLogChain}{wxlogchain} and -\helpref{wxLogPassThrough}{wxlogpassthrough} can be used. +normally. For this the \helpref{wxLogChain}{wxlogchain}, \helpref{wxLogInterposer}{wxloginterposer} and\rtfsp +\helpref{wxLogInterposerTemp}{wxloginterposertemp} can be used. diff --git a/include/wx/log.h b/include/wx/log.h index a28d31300c..4b4f745408 100644 --- a/include/wx/log.h +++ b/include/wx/log.h @@ -439,6 +439,9 @@ public: // override base class version to flush the old logger as well virtual void Flush(); + // call to avoid destroying the old log target + void DetachOldLog() { m_logOld = NULL; } + protected: // pass the chain to the old logger if needed virtual void DoLog(wxLogLevel level, const wxString& szString, time_t t); @@ -457,13 +460,28 @@ private: }; // a chain log target which uses itself as the new logger -class WXDLLIMPEXP_BASE wxLogPassThrough : public wxLogChain + +#define wxLogPassThrough wxLogInterposer + +class WXDLLIMPEXP_BASE wxLogInterposer : public wxLogChain +{ +public: + wxLogInterposer(); + +private: + DECLARE_NO_COPY_CLASS(wxLogInterposer) +}; + +// a temporary interposer which doesn't destroy the old log target +// (calls DetachOldLog) + +class WXDLLIMPEXP_BASE wxLogInterposerTemp : public wxLogChain { public: - wxLogPassThrough(); + wxLogInterposerTemp(); private: - DECLARE_NO_COPY_CLASS(wxLogPassThrough) + DECLARE_NO_COPY_CLASS(wxLogInterposerTemp) }; #if wxUSE_GUI diff --git a/src/common/log.cpp b/src/common/log.cpp index e0bc967110..89ed1264fc 100644 --- a/src/common/log.cpp +++ b/src/common/log.cpp @@ -865,18 +865,28 @@ void wxLogChain::DoLog(wxLogLevel level, const wxString& szString, time_t t) } } -// ---------------------------------------------------------------------------- -// wxLogPassThrough -// ---------------------------------------------------------------------------- - #ifdef __VISUALC__ // "'this' : used in base member initializer list" - so what? #pragma warning(disable:4355) #endif // VC++ -wxLogPassThrough::wxLogPassThrough() +// ---------------------------------------------------------------------------- +// wxLogInterposer +// ---------------------------------------------------------------------------- + +wxLogInterposer::wxLogInterposer() + : wxLogChain(this) +{ +} + +// ---------------------------------------------------------------------------- +// wxLogInterposerTemp +// ---------------------------------------------------------------------------- + +wxLogInterposerTemp::wxLogInterposerTemp() : wxLogChain(this) { + DetachOldLog(); } #ifdef __VISUALC__ -- 2.45.2