X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/251244a0200160fdea56437a0cafacee0010a8bc..192e6679f671a435a6276a475a57a0b8b501e0f4:/src/common/log.cpp diff --git a/src/common/log.cpp b/src/common/log.cpp index afcc832ec2..c9c4ab2776 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 // ---------------------------------------------------------------------------- @@ -419,83 +423,188 @@ wxLogStderr::wxLogStderr(FILE *fp) } #if defined(__WXMAC__) && !defined(__DARWIN__) -#define kDebuggerSignature 'MWDB' -static Boolean FindProcessBySignature(OSType signature, ProcessInfoRec* info) -{ - OSErr err; - ProcessSerialNumber psn; - Boolean found = false; - psn.highLongOfPSN = 0; - psn.lowLongOfPSN = kNoProcess; +#ifndef __MetroNubUtils__ +#include "MetroNubUtils.h" +#endif + +#ifdef __cplusplus + extern "C" { +#endif - if (!info) return false; +#ifndef __GESTALT__ +#include +#endif - info->processInfoLength = sizeof(ProcessInfoRec); - info->processName = NULL; - info->processAppSpec = NULL; +#ifndef true +#define true 1 +#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 false +#define false 0 +#endif + +#if TARGET_API_MAC_CARBON + + #include + + EXTERN_API_C( long ) + CallUniversalProc(UniversalProcPtr theProcPtr, ProcInfoType procInfo, ...); + + ProcPtr gCallUniversalProc_Proc = NULL; + +#endif -pascal Boolean MWDebuggerIsRunning(void) +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 void wxLogStderr::DoLogString(const wxChar *szString, time_t WXUNUSED(t)) @@ -519,30 +628,20 @@ 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 ( IsMWDebuggerRunning() && AmIBeingMWDebugged() ) { - AmIBeingMWDebugged( &running ) ; + running = true ; } -*/ + if (running) { #ifdef __powerc DebugStr(pstr); #else SysBreakStr(pstr); -#endif - } - else -#endif - { -#ifdef __powerc - DebugStr(pstr); -#else - DebugStr(pstr); #endif } #endif // Mac