]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/log.cpp
fixed bug in wxHtmlWindow: HistoryBack/Forward now correctly preserves last entry...
[wxWidgets.git] / src / common / log.cpp
index e187622915c17487a3ac99c188faf01ec469a1f5..e7669a12e9c1fbaec5432b50d7aebd200dc6ccee 100644 (file)
@@ -180,17 +180,17 @@ void wxLogVerbose(const wxChar *szFormat, ...)
 
       wxChar *p = s_szBuf;
       size_t len = WXSIZEOF(s_szBuf);
 
       wxChar *p = s_szBuf;
       size_t len = WXSIZEOF(s_szBuf);
-      strncpy(s_szBuf, _T("("), len);
-      len -= 2; // strlen("(")
-      p += 2;
-      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;
 
       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);
 
       va_list argptr;
       va_start(argptr, szFormat);
@@ -371,7 +371,7 @@ void wxLog::DoLog(wxLogLevel level, const wxChar *szString, time_t t)
 #ifdef __WXDEBUG__
             {
                 wxString msg = level == wxLOG_Trace ? wxT("Trace: ")
 #ifdef __WXDEBUG__
             {
                 wxString msg = level == wxLOG_Trace ? wxT("Trace: ")
-                                                    : wxT("Debug: "),
+                                                    : wxT("Debug: ");
                 msg << szString;
                 DoLogString(msg, t);
             }
                 msg << szString;
                 DoLogString(msg, t);
             }
@@ -402,6 +402,86 @@ wxLogStderr::wxLogStderr(FILE *fp)
         m_fp = 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;
 void wxLogStderr::DoLogString(const wxChar *szString, time_t WXUNUSED(t))
 {
     wxString str;
@@ -415,10 +495,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
     // 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
 #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
 }
 
 #endif // MSW
 }
 
@@ -638,35 +748,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
 #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;
 
                 Trap();
                 break;
 
-            case wxCANCEL:
+            case IDCANCEL:
                 s_bNoAsserts = TRUE;
                 break;
 
                 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;
 
                 Trap();
                 break;
 
-            case IDCANCEL:
+            case wxCANCEL:
                 s_bNoAsserts = TRUE;
                 break;
 
                 s_bNoAsserts = TRUE;
                 break;
 
-            //case IDNO: nothing to do
+            //case wxNO: nothing to do
         }
 #endif // GUI or MSW
 
         }
 #endif // GUI or MSW