#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
// ----------------------------------------------------------------------------
}
#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
- if (!info) return false;
+#ifdef __cplusplus
+ extern "C" {
+#endif
- info->processInfoLength = sizeof(ProcessInfoRec);
- info->processName = NULL;
- info->processAppSpec = NULL;
+#ifndef __GESTALT__
+#include <Gestalt.h>
+#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 true
+#define true 1
+#endif
+
+#ifndef false
+#define false 0
+#endif
-pascal Boolean MWDebuggerIsRunning(void)
+#if TARGET_API_MAC_CARBON
+
+ #include <CodeFragments.h>
+
+ 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
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
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;