Added SetLogBuffer method.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14495 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Ron Lee
2002-03-08 20:01:38 +00:00
parent c1beeb57cf
commit 04662def27
3 changed files with 140 additions and 110 deletions

View File

@@ -103,6 +103,12 @@ public:
// ctor // ctor
wxLog(); wxLog();
// Internal buffer.
// Allow replacement of the fixed size static buffer with
// a user allocated one. Pass in NULL to restore the
// built in static buffer.
static wxChar *SetLogBuffer( wxChar *buf, size_t size = 0 );
// these functions allow to completely disable all log messages // these functions allow to completely disable all log messages
// is logging disabled now? // is logging disabled now?
static bool IsEnabled() { return ms_doLog; } static bool IsEnabled() { return ms_doLog; }
@@ -579,3 +585,5 @@ DECLARE_LOG_FUNCTION2(SysError, long lErrCode);
#endif //debug/!debug #endif //debug/!debug
#endif // _WX_LOG_H_ #endif // _WX_LOG_H_
// vi:sts=4:sw=4:et

View File

@@ -65,7 +65,7 @@ void wxControlContainer::SetLastFocus(wxWindow *win)
// like when detaching a menubar from a frame with a child which // like when detaching a menubar from a frame with a child which
// has pushed itself as an event handler for the menubar. (wxGtk) // has pushed itself as an event handler for the menubar. (wxGtk)
wxASSERT_MSG( winParent, _T("Setting last focus for a window that is not our child?") ); wxASSERT_MSG( winParent, _T("Setting last-focus for a window that is not our child?") );
} }
} }

View File

@@ -89,7 +89,10 @@
#define LOG_BUFFER_SIZE (4096) #define LOG_BUFFER_SIZE (4096)
// static buffer for error messages // static buffer for error messages
static wxChar s_szBuf[LOG_BUFFER_SIZE]; static wxChar s_szBufStatic[LOG_BUFFER_SIZE];
static wxChar *s_szBuf = s_szBufStatic;
static size_t s_szBufSize = WXSIZEOF( s_szBufStatic );
#if wxUSE_THREADS #if wxUSE_THREADS
@@ -117,7 +120,7 @@ void wxVLogGeneric(wxLogLevel level, const wxChar *szFormat, va_list argptr)
if ( IsLoggingEnabled() ) { if ( IsLoggingEnabled() ) {
wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); wxCRIT_SECT_LOCKER(locker, gs_csLogBuf);
wxVsnprintf(s_szBuf, WXSIZEOF(s_szBuf), szFormat, argptr); wxVsnprintf(s_szBuf, s_szBufSize, szFormat, argptr);
wxLog::OnLog(level, s_szBuf, time(NULL)); wxLog::OnLog(level, s_szBuf, time(NULL));
} }
@@ -137,7 +140,7 @@ void wxLogGeneric(wxLogLevel level, const wxChar *szFormat, ...)
if ( IsLoggingEnabled() ) { \ if ( IsLoggingEnabled() ) { \
wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); \ wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); \
\ \
wxVsnprintf(s_szBuf, WXSIZEOF(s_szBuf), szFormat, argptr); \ wxVsnprintf(s_szBuf, s_szBufSize, szFormat, argptr); \
\ \
wxLog::OnLog(wxLOG_##level, s_szBuf, time(NULL)); \ wxLog::OnLog(wxLOG_##level, s_szBuf, time(NULL)); \
} \ } \
@@ -160,7 +163,7 @@ IMPLEMENT_LOG_FUNCTION(Status)
// always terminate the program // always terminate the program
void wxVLogFatalError(const wxChar *szFormat, va_list argptr) void wxVLogFatalError(const wxChar *szFormat, va_list argptr)
{ {
wxVsnprintf(s_szBuf, WXSIZEOF(s_szBuf), szFormat, argptr); wxVsnprintf(s_szBuf, s_szBufSize, szFormat, argptr);
#if wxUSE_GUI #if wxUSE_GUI
wxMessageBox(s_szBuf, _("Fatal Error"), wxID_OK | wxICON_STOP); wxMessageBox(s_szBuf, _("Fatal Error"), wxID_OK | wxICON_STOP);
@@ -187,7 +190,7 @@ void wxVLogVerbose(const wxChar *szFormat, va_list argptr)
if ( pLog != NULL && pLog->GetVerbose() ) { if ( pLog != NULL && pLog->GetVerbose() ) {
wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); wxCRIT_SECT_LOCKER(locker, gs_csLogBuf);
wxVsnprintf(s_szBuf, WXSIZEOF(s_szBuf), szFormat, argptr); wxVsnprintf(s_szBuf, s_szBufSize, szFormat, argptr);
wxLog::OnLog(wxLOG_Info, s_szBuf, time(NULL)); wxLog::OnLog(wxLOG_Info, s_szBuf, time(NULL));
} }
@@ -210,7 +213,7 @@ void wxLogVerbose(const wxChar *szFormat, ...)
if ( IsLoggingEnabled() ) { \ if ( IsLoggingEnabled() ) { \
wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); \ wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); \
\ \
wxVsnprintf(s_szBuf, WXSIZEOF(s_szBuf), szFormat, argptr); \ wxVsnprintf(s_szBuf, s_szBufSize, szFormat, argptr); \
\ \
wxLog::OnLog(wxLOG_##level, s_szBuf, time(NULL)); \ wxLog::OnLog(wxLOG_##level, s_szBuf, time(NULL)); \
} \ } \
@@ -229,7 +232,7 @@ void wxLogVerbose(const wxChar *szFormat, ...)
wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); wxCRIT_SECT_LOCKER(locker, gs_csLogBuf);
wxChar *p = s_szBuf; wxChar *p = s_szBuf;
size_t len = WXSIZEOF(s_szBuf); size_t len = s_szBufSize;
wxStrncpy(s_szBuf, _T("("), len); wxStrncpy(s_szBuf, _T("("), len);
len -= 1; // strlen("(") len -= 1; // strlen("(")
p += 1; p += 1;
@@ -264,7 +267,7 @@ void wxLogVerbose(const wxChar *szFormat, ...)
if ( IsLoggingEnabled() && ((wxLog::GetTraceMask() & mask) == mask) ) { if ( IsLoggingEnabled() && ((wxLog::GetTraceMask() & mask) == mask) ) {
wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); wxCRIT_SECT_LOCKER(locker, gs_csLogBuf);
wxVsnprintf(s_szBuf, WXSIZEOF(s_szBuf), szFormat, argptr); wxVsnprintf(s_szBuf, s_szBufSize, szFormat, argptr);
wxLog::OnLog(wxLOG_Trace, s_szBuf, time(NULL)); wxLog::OnLog(wxLOG_Trace, s_szBuf, time(NULL));
} }
@@ -294,7 +297,7 @@ void wxLogSysErrorHelper(long lErrCode)
wxChar szErrMsg[LOG_BUFFER_SIZE / 2]; wxChar szErrMsg[LOG_BUFFER_SIZE / 2];
wxSnprintf(szErrMsg, WXSIZEOF(szErrMsg), wxSnprintf(szErrMsg, WXSIZEOF(szErrMsg),
_(" (error %ld: %s)"), lErrCode, wxSysErrorMsg(lErrCode)); _(" (error %ld: %s)"), lErrCode, wxSysErrorMsg(lErrCode));
wxStrncat(s_szBuf, szErrMsg, WXSIZEOF(s_szBuf) - wxStrlen(s_szBuf)); wxStrncat(s_szBuf, szErrMsg, s_szBufSize - wxStrlen(s_szBuf));
wxLog::OnLog(wxLOG_Error, s_szBuf, time(NULL)); wxLog::OnLog(wxLOG_Error, s_szBuf, time(NULL));
} }
@@ -304,7 +307,7 @@ void WXDLLEXPORT wxVLogSysError(const wxChar *szFormat, va_list argptr)
if ( IsLoggingEnabled() ) { if ( IsLoggingEnabled() ) {
wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); wxCRIT_SECT_LOCKER(locker, gs_csLogBuf);
wxVsnprintf(s_szBuf, WXSIZEOF(s_szBuf), szFormat, argptr); wxVsnprintf(s_szBuf, s_szBufSize, szFormat, argptr);
wxLogSysErrorHelper(wxSysErrorCode()); wxLogSysErrorHelper(wxSysErrorCode());
} }
@@ -323,7 +326,7 @@ void WXDLLEXPORT wxVLogSysError(long lErrCode, const wxChar *szFormat, va_list a
if ( IsLoggingEnabled() ) { if ( IsLoggingEnabled() ) {
wxCRIT_SECT_LOCKER(locker, gs_csLogBuf); wxCRIT_SECT_LOCKER(locker, gs_csLogBuf);
wxVsnprintf(s_szBuf, WXSIZEOF(s_szBuf), szFormat, argptr); wxVsnprintf(s_szBuf, s_szBufSize, szFormat, argptr);
wxLogSysErrorHelper(lErrCode); wxLogSysErrorHelper(lErrCode);
} }
@@ -346,6 +349,24 @@ wxLog::wxLog()
m_bHasMessages = FALSE; m_bHasMessages = FALSE;
} }
wxChar *wxLog::SetLogBuffer( wxChar *buf, size_t size = 0 )
{
wxChar *oldbuf = s_szBuf;
if( buf == 0 )
{
s_szBuf = s_szBufStatic;
s_szBufSize = WXSIZEOF( s_szBufStatic );
}
else
{
s_szBuf = buf;
s_szBufSize = size;
}
return (oldbuf == s_szBufStatic ) ? 0 : oldbuf;
}
wxLog *wxLog::GetActiveTarget() wxLog *wxLog::GetActiveTarget()
{ {
if ( ms_bAutoCreate && ms_pLogger == NULL ) { if ( ms_bAutoCreate && ms_pLogger == NULL ) {
@@ -493,7 +514,7 @@ wxLogStderr::wxLogStderr(FILE *fp)
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#ifndef __GESTALT__ #ifndef __GESTALT__
@@ -510,163 +531,162 @@ wxLogStderr::wxLogStderr(FILE *fp)
#if TARGET_API_MAC_CARBON #if TARGET_API_MAC_CARBON
#include <CodeFragments.h> #include <CodeFragments.h>
EXTERN_API_C( long ) EXTERN_API_C( long )
CallUniversalProc(UniversalProcPtr theProcPtr, ProcInfoType procInfo, ...); CallUniversalProc(UniversalProcPtr theProcPtr, ProcInfoType procInfo, ...);
ProcPtr gCallUniversalProc_Proc = NULL; ProcPtr gCallUniversalProc_Proc = NULL;
#endif #endif
static MetroNubUserEntryBlock* gMetroNubEntry = NULL; static MetroNubUserEntryBlock* gMetroNubEntry = NULL;
static long fRunOnce = false; static long fRunOnce = false;
Boolean IsCompatibleVersion(short inVersion); Boolean IsCompatibleVersion(short inVersion);
/* --------------------------------------------------------------------------- /* ---------------------------------------------------------------------------
IsCompatibleVersion IsCompatibleVersion
--------------------------------------------------------------------------- */ --------------------------------------------------------------------------- */
Boolean IsCompatibleVersion(short inVersion) Boolean IsCompatibleVersion(short inVersion)
{ {
Boolean result = false; Boolean result = false;
if (fRunOnce) if (fRunOnce)
{ {
MetroNubUserEntryBlock* block = (MetroNubUserEntryBlock *)result; MetroNubUserEntryBlock* block = (MetroNubUserEntryBlock *)result;
result = (inVersion <= block->apiHiVersion); result = (inVersion <= block->apiHiVersion);
} }
return result; return result;
} }
/* --------------------------------------------------------------------------- /* ---------------------------------------------------------------------------
IsMetroNubInstalled IsMetroNubInstalled
--------------------------------------------------------------------------- */ --------------------------------------------------------------------------- */
Boolean IsMetroNubInstalled() Boolean IsMetroNubInstalled()
{ {
if (!fRunOnce) if (!fRunOnce)
{ {
long result, value; long result, value;
fRunOnce = true; fRunOnce = true;
gMetroNubEntry = NULL; gMetroNubEntry = NULL;
if (Gestalt(gestaltSystemVersion, &value) == noErr && value < 0x1000) if (Gestalt(gestaltSystemVersion, &value) == noErr && value < 0x1000)
{ {
/* look for MetroNub's Gestalt selector */ /* look for MetroNub's Gestalt selector */
if (Gestalt(kMetroNubUserSignature, &result) == noErr) if (Gestalt(kMetroNubUserSignature, &result) == noErr)
{ {
#if TARGET_API_MAC_CARBON #if TARGET_API_MAC_CARBON
if (gCallUniversalProc_Proc == NULL) if (gCallUniversalProc_Proc == NULL)
{ {
CFragConnectionID connectionID; CFragConnectionID connectionID;
Ptr mainAddress; Ptr mainAddress;
Str255 errorString; Str255 errorString;
ProcPtr symbolAddress; ProcPtr symbolAddress;
OSErr err; OSErr err;
CFragSymbolClass symbolClass; CFragSymbolClass symbolClass;
symbolAddress = NULL; symbolAddress = NULL;
err = GetSharedLibrary("\pInterfaceLib", kPowerPCCFragArch, kFindCFrag, err = GetSharedLibrary("\pInterfaceLib", kPowerPCCFragArch, kFindCFrag,
&connectionID, &mainAddress, errorString); &connectionID, &mainAddress, errorString);
if (err != noErr) if (err != noErr)
{ {
gCallUniversalProc_Proc = NULL; gCallUniversalProc_Proc = NULL;
goto end; goto end;
} }
err = FindSymbol(connectionID, "\pCallUniversalProc", err = FindSymbol(connectionID, "\pCallUniversalProc",
(Ptr *) &gCallUniversalProc_Proc, &symbolClass); (Ptr *) &gCallUniversalProc_Proc, &symbolClass);
if (err != noErr) if (err != noErr)
{ {
gCallUniversalProc_Proc = NULL; gCallUniversalProc_Proc = NULL;
goto end; goto end;
} }
} }
#endif #endif
{ {
MetroNubUserEntryBlock* block = (MetroNubUserEntryBlock *)result; MetroNubUserEntryBlock* block = (MetroNubUserEntryBlock *)result;
/* make sure the version of the API is compatible */ /* make sure the version of the API is compatible */
if (block->apiLowVersion <= kMetroNubUserAPIVersion && if (block->apiLowVersion <= kMetroNubUserAPIVersion &&
kMetroNubUserAPIVersion <= block->apiHiVersion) kMetroNubUserAPIVersion <= block->apiHiVersion)
gMetroNubEntry = block; /* success! */ gMetroNubEntry = block; /* success! */
} }
} }
} }
} }
end: end:
#if TARGET_API_MAC_CARBON #if TARGET_API_MAC_CARBON
return (gMetroNubEntry != NULL && gCallUniversalProc_Proc != NULL); return (gMetroNubEntry != NULL && gCallUniversalProc_Proc != NULL);
#else #else
return (gMetroNubEntry != NULL); return (gMetroNubEntry != NULL);
#endif #endif
} }
/* --------------------------------------------------------------------------- /* ---------------------------------------------------------------------------
IsMWDebuggerRunning [v1 API] IsMWDebuggerRunning [v1 API]
--------------------------------------------------------------------------- */ --------------------------------------------------------------------------- */
Boolean IsMWDebuggerRunning() Boolean IsMWDebuggerRunning()
{ {
if (IsMetroNubInstalled()) if (IsMetroNubInstalled())
return CallIsDebuggerRunningProc(gMetroNubEntry->isDebuggerRunning); return CallIsDebuggerRunningProc(gMetroNubEntry->isDebuggerRunning);
else else
return false; return false;
} }
/* --------------------------------------------------------------------------- /* ---------------------------------------------------------------------------
AmIBeingMWDebugged [v1 API] AmIBeingMWDebugged [v1 API]
--------------------------------------------------------------------------- */ --------------------------------------------------------------------------- */
Boolean AmIBeingMWDebugged() Boolean AmIBeingMWDebugged()
{ {
if (IsMetroNubInstalled()) if (IsMetroNubInstalled())
return CallAmIBeingDebuggedProc(gMetroNubEntry->amIBeingDebugged); return CallAmIBeingDebuggedProc(gMetroNubEntry->amIBeingDebugged);
else else
return false; return false;
} }
/* --------------------------------------------------------------------------- /* ---------------------------------------------------------------------------
UserSetWatchPoint [v2 API] UserSetWatchPoint [v2 API]
--------------------------------------------------------------------------- */ --------------------------------------------------------------------------- */
OSErr UserSetWatchPoint (Ptr address, long length, WatchPointIDT* watchPointID) OSErr UserSetWatchPoint (Ptr address, long length, WatchPointIDT* watchPointID)
{ {
if (IsMetroNubInstalled() && IsCompatibleVersion(kMetroNubUserAPIVersion)) if (IsMetroNubInstalled() && IsCompatibleVersion(kMetroNubUserAPIVersion))
return CallUserSetWatchPointProc(gMetroNubEntry->userSetWatchPoint, return CallUserSetWatchPointProc(gMetroNubEntry->userSetWatchPoint,
address, length, watchPointID); address, length, watchPointID);
else else
return errProcessIsNotClient; return errProcessIsNotClient;
} }
/* --------------------------------------------------------------------------- /* ---------------------------------------------------------------------------
ClearWatchPoint [v2 API] ClearWatchPoint [v2 API]
--------------------------------------------------------------------------- */ --------------------------------------------------------------------------- */
OSErr ClearWatchPoint (WatchPointIDT watchPointID) OSErr ClearWatchPoint (WatchPointIDT watchPointID)
{ {
if (IsMetroNubInstalled() && IsCompatibleVersion(kMetroNubUserAPIVersion)) if (IsMetroNubInstalled() && IsCompatibleVersion(kMetroNubUserAPIVersion))
return CallClearWatchPointProc(gMetroNubEntry->clearWatchPoint, return CallClearWatchPointProc(gMetroNubEntry->clearWatchPoint, watchPointID);
watchPointID); else
else return errProcessIsNotClient;
return errProcessIsNotClient;
} }
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif // !TARGET_API_MAC_CARBON #endif // !TARGET_API_MAC_CARBON
@@ -937,3 +957,5 @@ const wxChar *wxSysErrorMsg(unsigned long nErrCode)
} }
#endif //wxUSE_LOG #endif //wxUSE_LOG
// vi:sts=4:sw=4:et