X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/829f05419dd5538ef569e3db82847d1ce08d98c6..ce16e5d78fad60b6bbc6ef8889a663fd1c9f23d2:/src/common/log.cpp diff --git a/src/common/log.cpp b/src/common/log.cpp index 0a44516706..97f406c81f 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,15 +182,15 @@ void wxLogVerbose(const wxChar *szFormat, ...) wxChar *p = s_szBuf; size_t len = WXSIZEOF(s_szBuf); - strncpy(s_szBuf, _T("("), len); + wxStrncpy(s_szBuf, _T("("), len); len -= 1; // strlen("(") p += 1; - strncat(p, mask, len); + wxStrncat(p, mask, len); size_t lenMask = wxStrlen(mask); len -= lenMask; p += lenMask; - strncat(p, _T(") "), len); + wxStrncat(p, _T(") "), len); len -= 2; p += 2; @@ -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() @@ -402,6 +398,86 @@ wxLogStderr::wxLogStderr(FILE *fp) m_fp = fp; } +#if defined(__WXMAC__) && !defined(__UNIX__) +#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; @@ -415,11 +491,41 @@ 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")); -#endif // MSW -#if defined(__WXMAC__) && wxUSE_GUI - debugstr(str + wxT("\r\n")); + str += wxT("\r\n") ; + OutputDebugString(str.c_str()); #endif // MSW +#if defined(__WXMAC__) && !defined(__WXMAC_X__) && wxUSE_GUI + 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 // Mac } // ---------------------------------------------------------------------------- @@ -437,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 @@ -638,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 @@ -680,3 +788,4 @@ void wxOnAssert(const wxChar *szFile, int nLine, const wxChar *szMsg) #endif //WXDEBUG +#endif //wxUSE_LOG