X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dde11e605346b64d3ae0a39295fb5428298cfa3e..0b7e6e7da208b6a95fb23cb50286a09dc90d96d2:/src/os2/utils.cpp diff --git a/src/os2/utils.cpp b/src/os2/utils.cpp index 2e8d254f13..ec490fca94 100644 --- a/src/os2/utils.cpp +++ b/src/os2/utils.cpp @@ -24,7 +24,11 @@ #include "wx/intl.h" #include +#ifdef __EMX__ +#include +#else #include +#endif #include "wx/log.h" @@ -40,11 +44,12 @@ #define INCL_PM #define INCL_GPI #include -#include #define PURE_32 +#ifndef __EMX__ #include #include #include +#endif static const wxChar WX_SECTION[] = _T("wxWindows"); static const wxChar eHOSTNAME[] = _T("HostName"); @@ -65,17 +70,17 @@ bool wxGetHostName( #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 ); strcpy(zBuf, zServer); #else @@ -105,10 +110,12 @@ bool wxGetUserId( , int nType ) { +#ifndef __EMX__ long lrc; // UPM procs return 0 on success lrc = U32ELOCU((unsigned char*)zBuf, (unsigned long *)&nType); if (lrc == 0) return TRUE; +#endif return FALSE; } @@ -142,30 +149,63 @@ bool wxShell( const wxString& rCommand ) { - wxChar* zShell; - - if ((zShell = wxGetenv(_T("COMSPEC"))) == NULL) - zShell = _T("\\CMD.EXE"); - + wxChar* zShell = _T("CMD.EXE"); + wxString sInputs; wxChar zTmp[255]; + STARTDATA SData = {0}; + PSZ PgmTitle = "Command Shell"; + APIRET rc; + PID vPid = 0; + ULONG ulSessID = 0; + UCHAR achObjBuf[256] = {0}; //error data if DosStart fails + RESULTCODES vResult; + + SData.Length = sizeof(STARTDATA); + SData.Related = SSF_RELATED_INDEPENDENT; + SData.FgBg = SSF_FGBG_FORE; + SData.TraceOpt = SSF_TRACEOPT_NONE; + SData.PgmTitle = PgmTitle; + SData.PgmName = zShell; + + sInputs = "/C " + rCommand; + SData.PgmInputs = (BYTE*)sInputs.c_str(); + SData.TermQ = 0; + SData.Environment = 0; + SData.InheritOpt = SSF_INHERTOPT_SHELL; + SData.SessionType = SSF_TYPE_WINDOWABLEVIO; + SData.IconFile = 0; + SData.PgmHandle = 0; + SData.PgmControl = SSF_CONTROL_VISIBLE | SSF_CONTROL_MAXIMIZE; + SData.InitXPos = 30; + SData.InitYPos = 40; + SData.InitXSize = 200; + SData.InitYSize = 140; + SData.Reserved = 0; + SData.ObjectBuffer = (char*)achObjBuf; + SData.ObjectBuffLen = (ULONG)sizeof(achObjBuf); + + rc = ::DosStartSession(&SData, &ulSessID, &vPid); + if (rc == 0 || rc == 457) // NO_ERROR or SMG_START_IN_BACKGROUND + { + PTIB ptib; + PPIB ppib; - if (rCommand != "") - wxSprintf( zTmp - ,"%s /c %s" - ,zShell - ,WXSTRINGCAST rCommand - ); - else - wxStrcpy(zTmp, zShell); + ::DosGetInfoBlocks(&ptib, &ppib); - return (wxExecute((wxChar*)zTmp, FALSE) != 0); + ::DosWaitChild( DCWA_PROCESS + ,DCWW_WAIT + ,&vResult + ,&ppib->pib_ulpid + ,vPid + ); + } + return (rc != 0); } // Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX) -long wxGetFreeMemory( - void* pMemptr -) +long wxGetFreeMemory() { + void* pMemptr = NULL; ULONG lSize; ULONG lMemFlags; APIRET rc; @@ -233,6 +273,7 @@ void wxError( , const wxString& rTitle ) { + wxBuffer = new wxChar[256]; wxSprintf(wxBuffer, "%s\nContinue?", WXSTRINGCAST rMsg); if (::WinMessageBox( HWND_DESKTOP ,NULL @@ -241,6 +282,7 @@ void wxError( ,0 ,MB_ICONEXCLAMATION | MB_YESNO ) == MBID_YES) + delete[] wxBuffer; wxExit(); } @@ -276,14 +318,17 @@ int wxGetOsVersion( ) { ULONG ulSysInfo[QSV_MAX] = {0}; - - if (::DosQuerySysInfo( 1L - ,QSV_MAX - ,(PVOID)ulSysInfo - ,sizeof(ULONG) * QSV_MAX - )) + APIRET ulrc; + + ulrc = ::DosQuerySysInfo( 1L + ,QSV_MAX + ,(PVOID)ulSysInfo + ,sizeof(ULONG) * QSV_MAX + ); + if (ulrc == 0L) { *pMajorVsn = ulSysInfo[QSV_VERSION_MAJOR]; + *pMajorVsn = *pMajorVsn/10; *pMinorVsn = ulSysInfo[QSV_VERSION_MINOR]; return wxWINDOWS_OS2; } @@ -299,8 +344,8 @@ bool wxWriteResource( , const wxString& rFile ) { - HAB hab; - HINI hIni; + HAB hab = 0; + HINI hIni = 0; if (rFile != "") { @@ -381,9 +426,10 @@ bool wxGetResource( , const wxString& rFile ) { - HAB hab; - HINI hIni; - static const wxChar zDefunkt[] = _T("$$default"); + HAB hab = 0; + HINI hIni = 0; + wxChar zDefunkt[] = _T("$$default"); + char zBuf[1000]; if (rFile != "") { @@ -394,11 +440,14 @@ bool wxGetResource( ,(PSZ)WXSTRINGCAST rSection ,(PSZ)WXSTRINGCAST rEntry ,(PSZ)zDefunkt - ,(void*)wxBuffer + ,(PVOID)zBuf ,1000 ); - if (n == 0L || wxStrcmp(wxBuffer, zDefunkt) == 0) + if (zBuf == NULL) return FALSE; + if (n == 0L || wxStrcmp(zBuf, zDefunkt) == 0) + return FALSE; + zBuf[n-1] = '\0'; } else return FALSE; @@ -409,15 +458,16 @@ bool wxGetResource( ,(PSZ)WXSTRINGCAST rSection ,(PSZ)WXSTRINGCAST rEntry ,(PSZ)zDefunkt - ,(void*)wxBuffer + ,(PVOID)zBuf ,1000 ); - if (n == 0L || wxStrcmp(wxBuffer, zDefunkt) == 0) + if (zBuf == NULL) + return FALSE; + if (n == 0L || wxStrcmp(zBuf, zDefunkt) == 0) return FALSE; + zBuf[n-1] = '\0'; } - if (*ppValue) - delete[] (*ppValue); - *ppValue = copystring(wxBuffer); + strcpy((char*)*ppValue, zBuf); return TRUE; } @@ -429,6 +479,8 @@ bool wxGetResource( ) { wxChar* zStr = NULL; + + zStr = new wxChar[1000]; bool bSucc = wxGetResource( rSection ,rEntry ,(wxChar **)&zStr @@ -441,7 +493,11 @@ bool wxGetResource( delete[] zStr; return TRUE; } - else return FALSE; + else + { + delete[] zStr; + return FALSE; + } } bool wxGetResource( @@ -452,6 +508,8 @@ bool wxGetResource( ) { wxChar* zStr = NULL; + + zStr = new wxChar[1000]; bool bSucc = wxGetResource( rSection ,rEntry ,(wxChar **)&zStr @@ -464,7 +522,11 @@ bool wxGetResource( delete[] zStr; return TRUE; } - else return FALSE; + else + { + delete[] zStr; + return FALSE; + } } bool wxGetResource( @@ -475,6 +537,8 @@ bool wxGetResource( ) { wxChar* zStr = NULL; + + zStr = new wxChar[1000]; bool bSucc = wxGetResource( rSection ,rEntry ,(wxChar **)&zStr @@ -487,7 +551,11 @@ bool wxGetResource( delete[] zStr; return TRUE; } - else return FALSE; + else + { + delete[] zStr; + return FALSE; + } } #endif // wxUSE_RESOURCES @@ -563,6 +631,8 @@ wxChar* wxGetUserHome ( wxChar* zHome; wxString sUser1(rUser); + wxBuffer = new wxChar[256]; +#ifndef __EMX__ if (sUser1 != _T("")) { wxChar zTmp[64]; @@ -577,20 +647,27 @@ wxChar* wxGetUserHome ( if ((zHome = wxGetenv(_T("TMP"))) != NULL || (zHome = wxGetenv(_T("TMPDIR"))) != NULL || (zHome = wxGetenv(_T("TEMP"))) != NULL) + delete[] wxBuffer; return *zHome ? zHome : (wxChar*)_T("\\"); } if (wxStricmp(zTmp, WXSTRINGCAST sUser1) == 0) sUser1 = _T(""); } } +#endif if (sUser1 == _T("")) + { if ((zHome = wxGetenv(_T("HOME"))) != NULL) { wxStrcpy(wxBuffer, zHome); Unix2DosFilename(wxBuffer); - return wxBuffer; + wxStrcpy(zHome, wxBuffer); + delete[] wxBuffer; + return zHome; } - return NULL; // No home known! + } + delete[] wxBuffer; + return NULL; // No home known! } // Check whether this window wants to process messages, e.g. Stop button @@ -602,8 +679,8 @@ bool wxCheckForInterrupt( if(pWnd) { QMSG vMsg; - HAB hab; - HWND hwndFilter; + HAB hab = 0; + HWND hwndFilter = NULLHANDLE; HWND hwndWin= (HWND) pWnd->GetHWND(); while(::WinPeekMsg(hab, &vMsg, hwndFilter, 0, 0, PM_REMOVE)) @@ -671,12 +748,16 @@ void wxDisplaySize( { HPS hpsScreen; HDC hdcScreen; + LONG lWidth; + LONG lHeight; hpsScreen = ::WinGetScreenPS(HWND_DESKTOP); hdcScreen = ::GpiQueryDevice(hpsScreen); - ::DevQueryCaps(hdcScreen, CAPS_WIDTH, 1L, (PLONG)pWidth); - ::DevQueryCaps(hdcScreen, CAPS_HEIGHT, 1L, (PLONG)pHeight); + ::DevQueryCaps(hdcScreen, CAPS_WIDTH, 1L, &lWidth); + ::DevQueryCaps(hdcScreen, CAPS_HEIGHT, 1L, &lHeight); DevCloseDC(hdcScreen); + *pWidth = (int)lWidth; + *pHeight = (int)lHeight; } bool wxDirExists( @@ -736,3 +817,62 @@ WXWORD WXDLLEXPORT wxGetWindowId( return ::WinQueryWindowUShort((HWND)hWnd, QWS_ID); } +wxString WXDLLEXPORT wxPMErrorToStr( + ERRORID vError +) +{ + wxString sError; + + // + // Remove the high order byte -- it is useless + // + vError &= 0x0000ffff; + switch(vError) + { + case PMERR_INVALID_HWND: + sError = wxT("Invalid window handle specified"); + break; + + case PMERR_INVALID_FLAG: + sError = wxT("Invalid flag bit set"); + break; + + case PMERR_NO_MSG_QUEUE: + sError = wxT("No message queue available"); + break; + + case PMERR_INVALID_PARM: + sError = wxT("Parameter contained invalid data"); + break; + + case PMERR_INVALID_PARAMETERS: + sError = wxT("Parameter value is out of range"); + break; + + case PMERR_PARAMETER_OUT_OF_RANGE: + sError = wxT("Parameter value is out of range"); + break; + + case PMERR_INVALID_INTEGER_ATOM: + sError = wxT("Not a valid atom"); + break; + + case PMERR_INVALID_HATOMTBL: + sError = wxT("Atom table handle is invalid"); + break; + + case PMERR_INVALID_ATOM_NAME: + sError = wxT("Not a valid atom name"); + break; + + case PMERR_ATOM_NAME_NOT_FOUND: + sError = wxT("Valid name format, but cannot find name in atom table"); + break; + + default: + sError = wxT("Unknown error"); + } + return(sError); +} // end of wxPMErrorToStr + +