X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/00c4e8974da03deb970b04bf5d8abf4d71967bd1..937afade13326376cf1d3071057d069041172daa:/src/common/log.cpp diff --git a/src/common/log.cpp b/src/common/log.cpp index 2179500499..7268dddc04 100644 --- a/src/common/log.cpp +++ b/src/common/log.cpp @@ -50,6 +50,8 @@ #include "wx/log.h" #include "wx/thread.h" +#if wxUSE_LOG + // other standard headers #include #include @@ -180,17 +182,17 @@ void wxLogVerbose(const wxChar *szFormat, ...) wxChar *p = s_szBuf; size_t len = WXSIZEOF(s_szBuf); - strncpy(s_szBuf, _T("Trace ("), len); - len -= 7; // strlen("Trace (") - p += 7; - strncat(p, mask, len); + wxStrncpy(s_szBuf, _T("("), len); + len -= 1; // strlen("(") + p += 1; + wxStrncat(p, mask, len); size_t lenMask = wxStrlen(mask); len -= lenMask; p += lenMask; - strncat(p, _T("): "), len); - len -= 3; - p += 3; + wxStrncat(p, _T(") "), len); + len -= 2; + p += 2; va_list argptr; va_start(argptr, szFormat); @@ -272,13 +274,7 @@ void WXDLLEXPORT wxLogSysError(long lErrCode, const wxChar *szFormat, ...) wxLog::wxLog() { m_bHasMessages = FALSE; - - // enable verbose messages by default in the debug builds -#ifdef __WXDEBUG__ - m_bVerbose = TRUE; -#else // release m_bVerbose = FALSE; -#endif // debug/release } wxLog *wxLog::GetActiveTarget() @@ -369,8 +365,13 @@ void wxLog::DoLog(wxLogLevel level, const wxChar *szString, time_t t) case wxLOG_Trace: case wxLOG_Debug: #ifdef __WXDEBUG__ - DoLogString(szString, t); -#endif + { + wxString msg = level == wxLOG_Trace ? wxT("Trace: ") + : wxT("Debug: "); + msg << szString; + DoLogString(msg, t); + } +#endif // Debug break; } } @@ -397,6 +398,86 @@ wxLogStderr::wxLogStderr(FILE *fp) m_fp = fp; } +#if defined(__WXMAC__) +#define kDebuggerSignature 'MWDB' + +static Boolean FindProcessBySignature(OSType signature, ProcessInfoRec* info) +{ + OSErr err; + ProcessSerialNumber psn; + Boolean found = false; + psn.highLongOfPSN = 0; + psn.lowLongOfPSN = kNoProcess; + + if (!info) return false; + + info->processInfoLength = sizeof(ProcessInfoRec); + info->processName = NULL; + info->processAppSpec = NULL; + + err = noErr; + while (!found && err == noErr) + { + err = GetNextProcess(&psn); + if (err == noErr) + { + err = GetProcessInformation(&psn, info); + found = err == noErr && info->processSignature == signature; + } + } + return found; +} + +pascal Boolean MWDebuggerIsRunning(void) +{ + ProcessInfoRec info; + return FindProcessBySignature(kDebuggerSignature, &info); +} + +pascal OSErr AmIBeingMWDebugged(Boolean* result) +{ + OSErr err; + ProcessSerialNumber psn; + OSType sig = kDebuggerSignature; + AppleEvent theAE = {typeNull, NULL}; + AppleEvent theReply = {typeNull, NULL}; + AEAddressDesc addr = {typeNull, NULL}; + DescType actualType; + Size actualSize; + + if (!result) return paramErr; + + err = AECreateDesc(typeApplSignature, &sig, sizeof(sig), &addr); + if (err != noErr) goto exit; + + err = AECreateAppleEvent('MWDB', 'Dbg?', &addr, + kAutoGenerateReturnID, kAnyTransactionID, &theAE); + if (err != noErr) goto exit; + + GetCurrentProcess(&psn); + err = AEPutParamPtr(&theAE, keyDirectObject, typeProcessSerialNumber, + &psn, sizeof(psn)); + if (err != noErr) goto exit; + + err = AESend(&theAE, &theReply, kAEWaitReply, kAENormalPriority, + kAEDefaultTimeout, NULL, NULL); + if (err != noErr) goto exit; + + err = AEGetParamPtr(&theReply, keyAEResult, typeBoolean, &actualType, result, + sizeof(Boolean), &actualSize); + +exit: + if (addr.dataHandle) + AEDisposeDesc(&addr); + if (theAE.dataHandle) + AEDisposeDesc(&theAE); + if (theReply.dataHandle) + AEDisposeDesc(&theReply); + + return err; +} +#endif + void wxLogStderr::DoLogString(const wxChar *szString, time_t WXUNUSED(t)) { wxString str; @@ -410,10 +491,40 @@ void wxLogStderr::DoLogString(const wxChar *szString, time_t WXUNUSED(t)) // under Windows, programs usually don't have stderr at all, so show the // messages also under debugger - unless it's a console program #if defined(__WXMSW__) && wxUSE_GUI - OutputDebugString(str + wxT("\r\n")); + str += wxT("\r\n") ; + OutputDebugString(str.c_str()); #endif // MSW #if defined(__WXMAC__) && wxUSE_GUI - debugstr(str + wxT("\r\n")); + Str255 pstr ; + strcpy( (char*) pstr , str.c_str() ) ; + strcat( (char*) pstr , ";g" ) ; + c2pstr( (char*) pstr ) ; +#if __WXDEBUG__ + Boolean running = false ; + +/* + if ( MWDebuggerIsRunning() ) + { + AmIBeingMWDebugged( &running ) ; + } +*/ + if (running) + { + #ifdef __powerc + DebugStr(pstr); + #else + SysBreakStr(pstr); + #endif + } + else +#endif + { + #ifdef __powerc + DebugStr(pstr); + #else + DebugStr(pstr); + #endif + } #endif // MSW } @@ -432,7 +543,9 @@ wxLogStream::wxLogStream(ostream *ostr) void wxLogStream::DoLogString(const wxChar *szString, time_t WXUNUSED(t)) { - (*m_ostr) << wxConvertWX2MB(szString) << endl; + wxString str; + TimeStamp(&str); + (*m_ostr) << str << wxConvertWX2MB(szString) << endl; } #endif // wxUSE_STD_IOSTREAM @@ -448,6 +561,8 @@ wxLog *wxLog::ms_pLogger = (wxLog *)NULL; bool wxLog::ms_doLog = TRUE; bool wxLog::ms_bAutoCreate = TRUE; +size_t wxLog::ms_suspendCount = 0; + #if wxUSE_GUI const wxChar *wxLog::ms_timestamp = wxT("%X"); // time only, no date #else @@ -631,35 +746,35 @@ void wxOnAssert(const wxChar *szFile, int nLine, const wxChar *szMsg) #if wxUSE_GUI || defined(__WXMSW__) // this message is intentionally not translated - it is for // developpers only - wxStrcat(szBuf, wxT("\nDo you want to stop the program?" - "\nYou can also choose [Cancel] to suppress " - "further warnings.")); + wxStrcat(szBuf, wxT("\nDo you want to stop the program?\nYou can also choose [Cancel] to suppress further warnings.")); -#if wxUSE_GUI - switch ( wxMessageBox(szBuf, "Debug", - wxYES_NO | wxCANCEL | wxICON_STOP ) ) { - case wxYES: + // use the native message box if available: this is more robust than + // using our own +#ifdef __WXMSW__ + switch ( ::MessageBox(NULL, szBuf, _T("Debug"), + MB_YESNOCANCEL | MB_ICONSTOP ) ) { + case IDYES: Trap(); break; - case wxCANCEL: + case IDCANCEL: s_bNoAsserts = TRUE; break; - //case wxNO: nothing to do + //case IDNO: nothing to do } -#else // !GUI, but MSW - switch ( ::MessageBox(NULL, szBuf, "Debug", - MB_YESNOCANCEL | MB_ICONSTOP ) ) { - case IDYES: +#else // !MSW + switch ( wxMessageBox(szBuf, wxT("Debug"), + wxYES_NO | wxCANCEL | wxICON_STOP ) ) { + case wxYES: Trap(); break; - case IDCANCEL: + case wxCANCEL: s_bNoAsserts = TRUE; break; - //case IDNO: nothing to do + //case wxNO: nothing to do } #endif // GUI or MSW @@ -673,3 +788,4 @@ void wxOnAssert(const wxChar *szFile, int nLine, const wxChar *szMsg) #endif //WXDEBUG +#endif //wxUSE_LOG