X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dde11e605346b64d3ae0a39295fb5428298cfa3e..914955aaa034862c3b9b827463cde26455d06c79:/src/os2/utilsexc.cpp diff --git a/src/os2/utilsexc.cpp b/src/os2/utilsexc.cpp index cc19f5cad2..f03454c49a 100644 --- a/src/os2/utilsexc.cpp +++ b/src/os2/utilsexc.cpp @@ -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". @@ -25,8 +25,17 @@ #include "wx/os2/private.h" +#define PURE_32 +#ifndef __EMX__ +#include +#include +#include +#endif + #include -#include +#ifdef __EMX__ +#include +#endif #include #include @@ -37,6 +46,7 @@ #include #include + // 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');