X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8c5b1f0faff5b26bc9b2d9052069e951e7b41c74..78500b7db1287068a04469e1ce92b4fe99e4e4f0:/src/common/log.cpp diff --git a/src/common/log.cpp b/src/common/log.cpp index be03d3c4c8..3dfb000b32 100644 --- a/src/common/log.cpp +++ b/src/common/log.cpp @@ -60,6 +60,10 @@ #include "wx/msw/private.h" // includes windows.h for OutputDebugString #endif +#if defined(__WXMAC__) + #include "wx/mac/private.h" // includes mac headers +#endif + // ---------------------------------------------------------------------------- // non member functions // ---------------------------------------------------------------------------- @@ -418,86 +422,196 @@ wxLogStderr::wxLogStderr(FILE *fp) m_fp = fp; } -#if defined(__WXMAC__) && !defined(__DARWIN__) -#define kDebuggerSignature 'MWDB' +#if defined(__WXMAC__) && !defined(__DARWIN__) && (__MWERKS__ > 0x5300) -static Boolean FindProcessBySignature(OSType signature, ProcessInfoRec* info) -{ - OSErr err; - ProcessSerialNumber psn; - Boolean found = false; - psn.highLongOfPSN = 0; - psn.lowLongOfPSN = kNoProcess; +#if !TARGET_API_MAC_CARBON +// MetroNub stuff doesn't seem to work in CodeWarrior 5.3 Carbon builds... - if (!info) return false; +#ifndef __MetroNubUtils__ +#include "MetroNubUtils.h" +#endif - info->processInfoLength = sizeof(ProcessInfoRec); - info->processName = NULL; - info->processAppSpec = NULL; +#ifdef __cplusplus + extern "C" { +#endif - err = noErr; - while (!found && err == noErr) - { - err = GetNextProcess(&psn); - if (err == noErr) - { - err = GetProcessInformation(&psn, info); - found = err == noErr && info->processSignature == signature; - } - } - return found; -} +#ifndef __GESTALT__ +#include +#endif + +#ifndef true +#define true 1 +#endif + +#ifndef false +#define false 0 +#endif -pascal Boolean MWDebuggerIsRunning(void) +#if TARGET_API_MAC_CARBON + + #include + + EXTERN_API_C( long ) + CallUniversalProc(UniversalProcPtr theProcPtr, ProcInfoType procInfo, ...); + + ProcPtr gCallUniversalProc_Proc = NULL; + +#endif + +static MetroNubUserEntryBlock* gMetroNubEntry = NULL; + +static long fRunOnce = false; + +Boolean IsCompatibleVersion(short inVersion); + +/* --------------------------------------------------------------------------- + IsCompatibleVersion + --------------------------------------------------------------------------- */ + +Boolean IsCompatibleVersion(short inVersion) { - ProcessInfoRec info; - return FindProcessBySignature(kDebuggerSignature, &info); + Boolean result = false; + + if (fRunOnce) + { + MetroNubUserEntryBlock* block = (MetroNubUserEntryBlock *)result; + + result = (inVersion <= block->apiHiVersion); + } + + return result; } -pascal OSErr AmIBeingMWDebugged(Boolean* result) +/* --------------------------------------------------------------------------- + IsMetroNubInstalled + --------------------------------------------------------------------------- */ + +Boolean IsMetroNubInstalled() { - OSErr err; - ProcessSerialNumber psn; - OSType sig = kDebuggerSignature; - AppleEvent theAE = {typeNull, NULL}; - AppleEvent theReply = {typeNull, NULL}; - AEAddressDesc addr = {typeNull, NULL}; - DescType actualType; - Size actualSize; + if (!fRunOnce) + { + long result, value; + + fRunOnce = true; + gMetroNubEntry = NULL; + + if (Gestalt(gestaltSystemVersion, &value) == noErr && value < 0x1000) + { + /* look for MetroNub's Gestalt selector */ + if (Gestalt(kMetroNubUserSignature, &result) == noErr) + { + + #if TARGET_API_MAC_CARBON + if (gCallUniversalProc_Proc == NULL) + { + CFragConnectionID connectionID; + Ptr mainAddress; + Str255 errorString; + ProcPtr symbolAddress; + OSErr err; + CFragSymbolClass symbolClass; + + symbolAddress = NULL; + err = GetSharedLibrary("\pInterfaceLib", kPowerPCCFragArch, kFindCFrag, + &connectionID, &mainAddress, errorString); + + if (err != noErr) + { + gCallUniversalProc_Proc = NULL; + goto end; + } + + err = FindSymbol(connectionID, "\pCallUniversalProc", + (Ptr *) &gCallUniversalProc_Proc, &symbolClass); + + if (err != noErr) + { + gCallUniversalProc_Proc = NULL; + goto end; + } + } + #endif + + { + MetroNubUserEntryBlock* block = (MetroNubUserEntryBlock *)result; + + /* make sure the version of the API is compatible */ + if (block->apiLowVersion <= kMetroNubUserAPIVersion && + kMetroNubUserAPIVersion <= block->apiHiVersion) + gMetroNubEntry = block; /* success! */ + } + + } + } + } + +end: + +#if TARGET_API_MAC_CARBON + return (gMetroNubEntry != NULL && gCallUniversalProc_Proc != NULL); +#else + return (gMetroNubEntry != NULL); +#endif +} - if (!result) return paramErr; +/* --------------------------------------------------------------------------- + IsMWDebuggerRunning [v1 API] + --------------------------------------------------------------------------- */ - err = AECreateDesc(typeApplSignature, &sig, sizeof(sig), &addr); - if (err != noErr) goto exit; +Boolean IsMWDebuggerRunning() +{ + if (IsMetroNubInstalled()) + return CallIsDebuggerRunningProc(gMetroNubEntry->isDebuggerRunning); + else + return false; +} - err = AECreateAppleEvent(kDebuggerSignature, 'Dbg?', &addr, - kAutoGenerateReturnID, kAnyTransactionID, &theAE); - if (err != noErr) goto exit; +/* --------------------------------------------------------------------------- + AmIBeingMWDebugged [v1 API] + --------------------------------------------------------------------------- */ - GetCurrentProcess(&psn); - err = AEPutParamPtr(&theAE, keyDirectObject, typeProcessSerialNumber, - &psn, sizeof(psn)); - if (err != noErr) goto exit; +Boolean AmIBeingMWDebugged() +{ + if (IsMetroNubInstalled()) + return CallAmIBeingDebuggedProc(gMetroNubEntry->amIBeingDebugged); + else + return false; +} - err = AESend(&theAE, &theReply, kAEWaitReply, kAENormalPriority, - kAEDefaultTimeout, NULL, NULL); - if (err != noErr) goto exit; +/* --------------------------------------------------------------------------- + UserSetWatchPoint [v2 API] + --------------------------------------------------------------------------- */ - err = AEGetParamPtr(&theReply, keyAEResult, typeBoolean, &actualType, result, - sizeof(Boolean), &actualSize); +OSErr UserSetWatchPoint (Ptr address, long length, WatchPointIDT* watchPointID) +{ + if (IsMetroNubInstalled() && IsCompatibleVersion(kMetroNubUserAPIVersion)) + return CallUserSetWatchPointProc(gMetroNubEntry->userSetWatchPoint, + address, length, watchPointID); + else + return errProcessIsNotClient; +} -exit: - if (addr.dataHandle) - AEDisposeDesc(&addr); - if (theAE.dataHandle) - AEDisposeDesc(&theAE); - if (theReply.dataHandle) - AEDisposeDesc(&theReply); +/* --------------------------------------------------------------------------- + ClearWatchPoint [v2 API] + --------------------------------------------------------------------------- */ - return err; +OSErr ClearWatchPoint (WatchPointIDT watchPointID) +{ + if (IsMetroNubInstalled() && IsCompatibleVersion(kMetroNubUserAPIVersion)) + return CallClearWatchPointProc(gMetroNubEntry->clearWatchPoint, + watchPointID); + else + return errProcessIsNotClient; } + +#ifdef __cplusplus + } #endif +#endif // !TARGET_API_MAC_CARBON + +#endif // defined(__WXMAC__) && !defined(__DARWIN__) && (__MWERKS__ > 0x5300) + void wxLogStderr::DoLogString(const wxChar *szString, time_t WXUNUSED(t)) { wxString str; @@ -519,30 +633,24 @@ void wxLogStderr::DoLogString(const wxChar *szString, time_t WXUNUSED(t)) strcpy( (char*) pstr , str.c_str() ) ; strcat( (char*) pstr , ";g" ) ; c2pstr( (char*) pstr ) ; -#if __WXDEBUG__ + Boolean running = false ; -/* - if ( MWDebuggerIsRunning() ) +#if !TARGET_API_MAC_CARBON && (__MWERKS__ > 0x5300) + + if ( IsMWDebuggerRunning() && AmIBeingMWDebugged() ) { - AmIBeingMWDebugged( &running ) ; + running = true ; } -*/ + +#endif + if (running) { #ifdef __powerc DebugStr(pstr); #else SysBreakStr(pstr); -#endif - } - else -#endif - { -#ifdef __powerc - DebugStr(pstr); -#else - DebugStr(pstr); #endif } #endif // Mac @@ -732,20 +840,23 @@ const wxChar *wxSysErrorMsg(unsigned long nErrCode) 0, NULL); // copy it to our buffer and free memory - if( lpMsgBuf != 0 ) + if( lpMsgBuf != 0 ) { wxStrncpy(s_szBuf, (const wxChar *)lpMsgBuf, WXSIZEOF(s_szBuf) - 1); - else + s_szBuf[WXSIZEOF(s_szBuf) - 1] = wxT('\0'); + + LocalFree(lpMsgBuf); + + // returned string is capitalized and ended with '\r\n' - bad + s_szBuf[0] = (wxChar)wxTolower(s_szBuf[0]); + size_t len = wxStrlen(s_szBuf); + if ( len > 0 ) { + // truncate string + if ( s_szBuf[len - 2] == wxT('\r') ) + s_szBuf[len - 2] = wxT('\0'); + } + } + else { s_szBuf[0] = wxT('\0'); - s_szBuf[WXSIZEOF(s_szBuf) - 1] = wxT('\0'); - LocalFree(lpMsgBuf); - - // returned string is capitalized and ended with '\r\n' - bad - s_szBuf[0] = (wxChar)wxTolower(s_szBuf[0]); - size_t len = wxStrlen(s_szBuf); - if ( len > 0 ) { - // truncate string - if ( s_szBuf[len - 2] == wxT('\r') ) - s_szBuf[len - 2] = wxT('\0'); } return s_szBuf;