Support using GetTextExtent() with empty string to get descent in wxOSX.
[wxWidgets.git] / utils / execmon / execmon.cpp
index eab39f2cae4fa8aad9b263fa0b1294be209549cb..b78809596a6caa207b54dbe79d55b44feb983fc6 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     25/3/09
 // RCS-ID:      $Id$
 // Copyright:   (c) 2009 Francesco Montorsi
 // Created:     25/3/09
 // RCS-ID:      $Id$
 // Copyright:   (c) 2009 Francesco Montorsi
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
 /////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
@@ -25,6 +25,8 @@
 #endif
 
 #ifndef WX_PRECOMP
 #endif
 
 #ifndef WX_PRECOMP
+    #include "wx/app.h"
+    #include "wx/log.h"
 #endif // WX_PRECOMP
 
 #include "wx/cmdline.h"
 #endif // WX_PRECOMP
 
 #include "wx/cmdline.h"
@@ -33,6 +35,8 @@
 #include "wx/sstream.h"
 #include "wx/utils.h"
 #include "wx/filename.h"
 #include "wx/sstream.h"
 #include "wx/utils.h"
 #include "wx/filename.h"
+#include "wx/app.h"
+#include "wx/log.h"
 
 // ============================================================================
 // implementation
 
 // ============================================================================
 // implementation
@@ -47,13 +51,13 @@ class MonitoredProcess : public wxProcess
 public:
     MonitoredProcess()
         { Redirect(); m_crashed=false; m_exitCode=0; }
 public:
     MonitoredProcess()
         { Redirect(); m_crashed=false; m_exitCode=0; }
-    
+
     void OnTerminate(int WXUNUSED(pid), int status)
     {
     void OnTerminate(int WXUNUSED(pid), int status)
     {
-        wxStringOutputStream stdout, stderr;
-        if (GetInputStream()) stdout.Write(*GetInputStream());
-        if (GetErrorStream()) stderr.Write(*GetErrorStream());
-        
+        wxStringOutputStream out, err;
+        if (GetInputStream()) out.Write(*GetInputStream());
+        if (GetErrorStream()) err.Write(*GetErrorStream());
+
         //wxPrintf("%s\n", stdout.GetString());
         //wxPrintf("%s\n", stderr.GetString());
 
         //wxPrintf("%s\n", stdout.GetString());
         //wxPrintf("%s\n", stderr.GetString());
 
@@ -62,26 +66,26 @@ public:
         // but then the assert dialog pop-ups and thus the app doesn't exit
         // FIXME: make assertion detection work also under other platforms
         //        see http://trac.wxwidgets.org/ticket/10697
         // but then the assert dialog pop-ups and thus the app doesn't exit
         // FIXME: make assertion detection work also under other platforms
         //        see http://trac.wxwidgets.org/ticket/10697
-        m_crashed = stdout.GetString().Contains("assert") ||
-                    stderr.GetString().Contains("assert");
+        m_crashed = out.GetString().Contains("assert") ||
+                    err.GetString().Contains("assert");
         m_exitCode = status;
     }
         m_exitCode = status;
     }
-    
+
     void Kill()
     {
         wxProcess::Kill(GetPid());
     void Kill()
     {
         wxProcess::Kill(GetPid());
-        
+
         // wxProcess::Kill doesn't trigger a call to OnTerminate() normally...
         // but we still need to call it!
         OnTerminate(0, -1);
     }
         // wxProcess::Kill doesn't trigger a call to OnTerminate() normally...
         // but we still need to call it!
         OnTerminate(0, -1);
     }
-    
+
     bool Crashed() const
         { return m_crashed; }
     bool Crashed() const
         { return m_crashed; }
-        
+
     int GetExitCode() const
         { return m_exitCode; }
     int GetExitCode() const
         { return m_exitCode; }
-    
+
 private:
     bool m_crashed;
     int m_exitCode;
 private:
     bool m_crashed;
     int m_exitCode;
@@ -102,37 +106,40 @@ public:
 
 bool TestExec(const wxVector<wxFileName>& programs, long timeout)
 {
 
 bool TestExec(const wxVector<wxFileName>& programs, long timeout)
 {
+    size_t i;
     wxVector<MonitorData*> data;
     wxVector<MonitorData*> data;
-    
+
     // run all programs specified as command line parameters
     wxArrayLong procID;
     // run all programs specified as command line parameters
     wxArrayLong procID;
-    for (size_t i=0; i<programs.size(); i++)
+    for (i=0; i<programs.size(); i++)
     {
         MonitorData *dt = new MonitorData(programs[i].GetFullPath());
     {
         MonitorData *dt = new MonitorData(programs[i].GetFullPath());
-        
+
         long pid = wxExecute(programs[i].GetFullPath(), wxEXEC_ASYNC, &dt->process);
         if (pid == 0)
         long pid = wxExecute(programs[i].GetFullPath(), wxEXEC_ASYNC, &dt->process);
         if (pid == 0)
+        {
             wxLogError("could not run the program '%s'", programs[i].GetFullPath());
             wxLogError("could not run the program '%s'", programs[i].GetFullPath());
+        }
         else
         {
         else
         {
-            wxLogMessage("started program '%s' (pid %d)...", 
+            wxLogMessage("started program '%s' (pid %d)...",
                          programs[i].GetFullPath(), pid);
             wxASSERT(dt->process.GetPid() == pid);
 
             data.push_back(dt);
         }
     }
                          programs[i].GetFullPath(), pid);
             wxASSERT(dt->process.GetPid() == pid);
 
             data.push_back(dt);
         }
     }
-    
+
     // sleep some moments
     wxSleep(timeout);
     // sleep some moments
     wxSleep(timeout);
-    
+
     // check if all processes are still running
     bool allok = true;
     // check if all processes are still running
     bool allok = true;
-    for (size_t i=0; i<data.size(); i++)
+    for (i=0; i<data.size(); i++)
     {
         MonitoredProcess& proc = data[i]->process;
         const wxString& prog = data[i]->program;
     {
         MonitoredProcess& proc = data[i]->process;
         const wxString& prog = data[i]->program;
-        
+
         if (wxProcess::Exists(proc.GetPid()))
             proc.Kill();
         else
         if (wxProcess::Exists(proc.GetPid()))
             proc.Kill();
         else
@@ -140,8 +147,8 @@ bool TestExec(const wxVector<wxFileName>& programs, long timeout)
             // this typically never happens, at least when running wx-programs
             // built with debug builds of wx (see MonitoredProcess::OnTerminate;
             // even if an asserts fail the app doesn't automatically close!):
             // this typically never happens, at least when running wx-programs
             // built with debug builds of wx (see MonitoredProcess::OnTerminate;
             // even if an asserts fail the app doesn't automatically close!):
-            
-            wxLogMessage("program '%s' (pid %d) is NOT running anymore...", 
+
+            wxLogMessage("program '%s' (pid %d) is NOT running anymore...",
                          prog, proc.GetPid());
             allok = false;
         }
                          prog, proc.GetPid());
             allok = false;
         }
@@ -149,14 +156,14 @@ bool TestExec(const wxVector<wxFileName>& programs, long timeout)
         if (data[i]->process.Crashed())
         {
             allok = false;
         if (data[i]->process.Crashed())
         {
             allok = false;
-            wxLogMessage("program '%s' (pid %d) crashed...", 
+            wxLogMessage("program '%s' (pid %d) crashed...",
                          prog, proc.GetPid());
         }
         else
                          prog, proc.GetPid());
         }
         else
-            wxLogMessage("program '%s' (pid %d) ended with exit code %d...", 
+            wxLogMessage("program '%s' (pid %d) ended with exit code %d...",
                          prog, proc.GetPid(), proc.GetExitCode());
     }
                          prog, proc.GetPid(), proc.GetExitCode());
     }
-    
+
     return allok;
 }
 
     return allok;
 }
 
@@ -177,19 +184,19 @@ int main(int argc, char **argv)
 
     static const wxCmdLineEntryDesc cmdLineDesc[] =
     {
 
     static const wxCmdLineEntryDesc cmdLineDesc[] =
     {
-        { wxCMD_LINE_SWITCH, "h", "help", 
+        { wxCMD_LINE_SWITCH, "h", "help",
             "show this help message",
             wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP },
             "show this help message",
             wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP },
-        { wxCMD_LINE_OPTION, "t", "timeout", 
+        { wxCMD_LINE_OPTION, "t", "timeout",
             "kills all processes still alive after 'num' seconds",
             wxCMD_LINE_VAL_NUMBER, 0 },
             "kills all processes still alive after 'num' seconds",
             wxCMD_LINE_VAL_NUMBER, 0 },
-        { wxCMD_LINE_PARAM, "", "", 
+        { wxCMD_LINE_PARAM, "", "",
             "program-to-run",
             wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE },
 
         { wxCMD_LINE_NONE }
     };
             "program-to-run",
             wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE },
 
         { wxCMD_LINE_NONE }
     };
-    
+
     wxLog::DisableTimestamp();
 
     wxCmdLineParser parser(cmdLineDesc, argc, argv);
     wxLog::DisableTimestamp();
 
     wxCmdLineParser parser(cmdLineDesc, argc, argv);
@@ -208,14 +215,14 @@ int main(int argc, char **argv)
                 wxFileName fn(parser.GetParam(i));
                 if (!fn.IsAbsolute())
                     fn.MakeAbsolute();
                 wxFileName fn(parser.GetParam(i));
                 if (!fn.IsAbsolute())
                     fn.MakeAbsolute();
-                
+
                 programs.push_back(fn);
             }
                 programs.push_back(fn);
             }
-            
+
             long timeout;
             if (!parser.Found("t", &timeout))
                 timeout = 3;
             long timeout;
             if (!parser.Found("t", &timeout))
                 timeout = 3;
-            
+
             return TestExec(programs, timeout) ? 0 : 1;
         }
         break;
             return TestExec(programs, timeout) ? 0 : 1;
         }
         break;