]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/utilsexc.cpp
placeholder
[wxWidgets.git] / src / os2 / utilsexc.cpp
index cc19f5cad29f8082d1f20b96f1783e958c9b7e8f..f03454c49afd159f3cd979dbff6a2f48146e0b4c 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     10/17/99
 // RCS-ID:      $Id$
 // Copyright:   (c) David Webster
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // For compilers that support precompilation, includes "wx.h".
 
 #include "wx/os2/private.h"
 
+#define PURE_32
+#ifndef __EMX__
+#include <upm.h>
+#include <netcons.h>
+#include <netbios.h>
+#endif
+
 #include <ctype.h>
-#include <direct.h>
+#ifdef __EMX__
+#include <dirent.h>
+#endif
 
 #include <sys/stat.h>
 #include <io.h>
@@ -37,6 +46,7 @@
 #include <errno.h>
 #include <stdarg.h>
 
+
 // this message is sent when the process we're waiting for terminates
 #define wxWM_PROC_TERMINATED (WM_USER + 10000)
 
@@ -50,6 +60,7 @@ struct wxExecuteData
 public:
     ~wxExecuteData()
     {
+//         cout << "Closing thread: " << endl;
         DosExit(EXIT_PROCESS, 0);
     }
 
@@ -67,8 +78,10 @@ static ULONG wxExecuteThread(
     ULONG                           ulRc;
     PID                             vPidChild;
 
-     ulRc = ::DosWaitChild( DCWA_PROCESSTREE
-                          ,DCWW_WAIT
+//     cout << "Executing thread: " << endl;
+
+    ulRc = ::DosWaitChild( DCWA_PROCESSTREE
+                          ,DCWW_NOWAIT
                           ,&pData->vResultCodes
                           ,&vPidChild
                           ,pData->vResultCodes.codeTerminate // process PID to look at
@@ -78,14 +91,11 @@ static ULONG wxExecuteThread(
         wxLogLastError("DosWaitChild");
     }
     delete pData;
-
-
-//    ::WinSendMsg(pData->hWnd, (ULONG)wxWM_PROC_TERMINATED, 0, (MPARAM)pData);
     return 0;
 }
 
-// Unlike windows where everything needs a window, console apps in OS/2
-// need no windows so this is not ever used
+// window procedure of a hidden window which is created just to receive
+// the notification message when a process exits
 MRESULT APIENTRY wxExecuteWindowCbk(
   HWND                              hWnd
 , ULONG                             ulMessage
@@ -120,15 +130,17 @@ MRESULT APIENTRY wxExecuteWindowCbk(
     return 0;
 }
 
-extern wxChar wxPanelClassName[];
-
 long wxExecute(
   const wxString&                   rCommand
-, bool                              bSync
+, int                               flags
 , wxProcess*                        pHandler
 )
 {
-    wxCHECK_MSG(!!rCommand, 0, wxT("empty command in wxExecute"));
+    if (rCommand.IsEmpty())
+    {
+//         cout << "empty command in wxExecute." << endl;
+        return 0;
+    }
 
     // create the process
     UCHAR                           vLoadError[CCHMAXPATH] = {0};
@@ -136,56 +148,35 @@ long wxExecute(
     ULONG                           ulExecFlag;
     PSZ                             zArgs = NULL;
     PSZ                             zEnvs = NULL;
-    ULONG                           ulWindowId;
     APIRET                          rc;
-    PFNWP                           pOldProc;
     TID                             vTID;
 
-    if (bSync)
+    if (flags & wxEXEC_SYNC)
         ulExecFlag = EXEC_SYNC;
     else
         ulExecFlag = EXEC_ASYNCRESULT;
 
-    if (::DosExecPgm( (PCHAR)vLoadError
-                     ,sizeof(vLoadError)
-                     ,ulExecFlag
-                     ,zArgs
-                     ,zEnvs
-                     ,&vResultCodes
-                     ,rCommand
-                    ))
+    rc = ::DosExecPgm( (PCHAR)vLoadError
+                      ,sizeof(vLoadError)
+                      ,ulExecFlag
+                      ,zArgs
+                      ,zEnvs
+                      ,&vResultCodes
+                      ,(PSZ)rCommand.c_str()
+                     );
+    if (rc != NO_ERROR)
     {
-        wxLogSysError(_("Execution of command '%s' failed"), rCommand.c_str());
+        wxLogSysError(_("Execution of command '%s' failed with error: %ul"), rCommand.c_str(), rc);
         return 0;
     }
-
-    // PM does not need non visible object windows to run console child processes
-/*
-    HWND                            hwnd = ::WinCreateWindow( HWND_DESKTOP
-                                                             ,wxPanelClassName
-                                                             ,NULL
-                                                             ,0
-                                                             ,0
-                                                             ,0
-                                                             ,0
-                                                             ,0
-                                                             ,NULLHANDLE
-                                                             ,NULLHANDLE
-                                                             ,ulWindowId
-                                                             ,NULL
-                                                             ,NULL
-                                                            );
-    wxASSERT_MSG( hwnd, wxT("can't create a hidden window for wxExecute") );
-    pOldProc = ::WinSubclassWindow(hwnd, (PFNWP)&wxExecuteWindowCbk);
-
-*/
+//     cout << "Executing: " << rCommand.c_str() << endl;
     // Alloc data
     wxExecuteData*                  pData = new wxExecuteData;
 
     pData->vResultCodes = vResultCodes;
     pData->hWnd         = NULLHANDLE;
-    pData->bState       = bSync;
-    if (bSync)
+    pData->bState       = (flags & wxEXEC_SYNC) != 0;
+    if (flags & wxEXEC_SYNC)
     {
         wxASSERT_MSG(!pHandler, wxT("wxProcess param ignored for sync execution"));
         pData->pHandler = NULL;
@@ -205,20 +196,22 @@ long wxExecute(
     if (rc != NO_ERROR)
     {
         wxLogLastError("CreateThread in wxExecute");
-
-//      ::WinDestroyWindow(hwnd);
         delete pData;
 
         // the process still started up successfully...
         return vResultCodes.codeTerminate;
     }
-    if (!bSync)
+    if (!(flags & wxEXEC_SYNC))
     {
-        // clean up will be done when the process terminates
-
         // return the pid
+        // warning: don't exit your app unless you actively
+        // kill and cleanup you child processes
+        // Maybe detach the process here???
+        // If cmd.exe need to pass DETACH to detach the process here
         return vResultCodes.codeTerminate;
     }
+
+    // waiting until command executed
     ::DosWaitThread(&vTID, DCWW_WAIT);
 
     ULONG ulExitCode = pData->vResultCodes.codeResult;
@@ -230,7 +223,7 @@ long wxExecute(
 
 long wxExecute(
   char**                            ppArgv
-, bool                              bSync
+, int                               flags
 , wxProcess*                        pHandler
 )
 {
@@ -242,7 +235,7 @@ long wxExecute(
     }
     sCommand.RemoveLast();
     return wxExecute( sCommand
-                     ,bSync
+                     ,flags
                      ,pHandler
                     );
 }
@@ -255,17 +248,17 @@ bool wxGetFullHostName(
 #if wxUSE_NET_API
     char                            zServer[256];
     char                            zComputer[256];
-    unsigned short                  nLevel = 0;
-    unsigned char*                  zBuffer;
-    unsigned short                  nBuffer;
-    unsigned short*                 pnTotalAvail;
+    unsigned long                   ulLevel = 0;
+    unsigned char*                  zBuffer = NULL;
+    unsigned long                   ulBuffer = 256;
+    unsigned long*                  pulTotalAvail = NULL;
 
     NetBios32GetInfo( (const unsigned char*)zServer
                      ,(const unsigned char*)zComputer
-                     ,nLevel
+                     ,ulLevel
                      ,zBuffer
-                     ,nBuffer
-                     ,pnTotalAvail
+                     ,ulBuffer
+                     ,pulTotalAvail
                     );
     strncpy(zBuf, zComputer, nMaxSize);
     zBuf[nMaxSize] = _T('\0');