]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/utils.cpp
no message
[wxWidgets.git] / src / os2 / utils.cpp
index e9ace4262613377ed4d3a94244bfeed63a049a54..34cb8a977f85db24a84c0ffadf90f58ac64ee2de 100644 (file)
 #include "wx/intl.h"
 
 #include <ctype.h>
 #include "wx/intl.h"
 
 #include <ctype.h>
+#ifdef __EMX__
+#include <dirent.h>
+#else
 #include <direct.h>
 #include <direct.h>
+#endif
 
 #include "wx/log.h"
 
 
 #include "wx/log.h"
 
 #define INCL_PM
 #define INCL_GPI
 #include <os2.h>
 #define INCL_PM
 #define INCL_GPI
 #include <os2.h>
-#include<netdb.h>
 #define PURE_32
 #define PURE_32
+#ifndef __EMX__
 #include <upm.h>
 #include <netcons.h>
 #include <netbios.h>
 #include <upm.h>
 #include <netcons.h>
 #include <netbios.h>
+#endif
 
 static const wxChar WX_SECTION[] = _T("wxWindows");
 static const wxChar eHOSTNAME[]  = _T("HostName");
 
 static const wxChar WX_SECTION[] = _T("wxWindows");
 static const wxChar eHOSTNAME[]  = _T("HostName");
@@ -65,10 +70,10 @@ bool wxGetHostName(
 #if wxUSE_NET_API
     char                            zServer[256];
     char                            zComputer[256];
 #if wxUSE_NET_API
     char                            zServer[256];
     char                            zComputer[256];
-    unsigned long                   ulLevel;
-    unsigned char*                  zBuffer;
-    unsigned long                   ulBuffer;
-    unsigned long*                  pulTotalAvail;
+    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
 
     NetBios32GetInfo( (const unsigned char*)zServer
                      ,(const unsigned char*)zComputer
@@ -102,10 +107,16 @@ bool wxGetHostName(
 // Get user ID e.g. jacs
 bool wxGetUserId(
   wxChar*                           zBuf
 // Get user ID e.g. jacs
 bool wxGetUserId(
   wxChar*                           zBuf
-, int                               nMaxSize
+, int                               nType
 )
 {
 )
 {
-   return(U32ELOCL((unsigned char*)zBuf, (unsigned long *)&nMaxSize));
+#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;
 }
 
 bool wxGetUserName(
 }
 
 bool wxGetUserName(
@@ -138,30 +149,63 @@ bool wxShell(
   const wxString&                   rCommand
 )
 {
   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];
     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)
 }
 
 // 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;
     ULONG                           lSize;
     ULONG                           lMemFlags;
     APIRET                          rc;
@@ -229,6 +273,7 @@ void wxError(
 , const wxString&                   rTitle
 )
 {
 , const wxString&                   rTitle
 )
 {
+    wxBuffer = new wxChar[256];
     wxSprintf(wxBuffer, "%s\nContinue?", WXSTRINGCAST rMsg);
     if (::WinMessageBox( HWND_DESKTOP
                         ,NULL
     wxSprintf(wxBuffer, "%s\nContinue?", WXSTRINGCAST rMsg);
     if (::WinMessageBox( HWND_DESKTOP
                         ,NULL
@@ -237,6 +282,7 @@ void wxError(
                         ,0
                         ,MB_ICONEXCLAMATION | MB_YESNO
                        ) == MBID_YES)
                         ,0
                         ,MB_ICONEXCLAMATION | MB_YESNO
                        ) == MBID_YES)
+    delete[] wxBuffer;
     wxExit();
 }
 
     wxExit();
 }
 
@@ -272,14 +318,17 @@ int wxGetOsVersion(
 )
 {
     ULONG                           ulSysInfo[QSV_MAX] = {0};
 )
 {
     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 = ulSysInfo[QSV_VERSION_MAJOR];
+        *pMajorVsn = *pMajorVsn/10;
         *pMinorVsn = ulSysInfo[QSV_VERSION_MINOR];
         return wxWINDOWS_OS2;
     }
         *pMinorVsn = ulSysInfo[QSV_VERSION_MINOR];
         return wxWINDOWS_OS2;
     }
@@ -295,8 +344,8 @@ bool wxWriteResource(
 , const wxString&                   rFile
 )
 {
 , const wxString&                   rFile
 )
 {
-    HAB                             hab;
-    HINI                            hIni;
+    HAB                             hab = 0;
+    HINI                            hIni = 0;
 
     if (rFile != "")
     {
 
     if (rFile != "")
     {
@@ -377,9 +426,10 @@ bool wxGetResource(
 , const wxString&                   rFile
 )
 {
 , 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 != "")
     {
 
     if (rFile != "")
     {
@@ -390,11 +440,14 @@ bool wxGetResource(
                                               ,(PSZ)WXSTRINGCAST rSection
                                               ,(PSZ)WXSTRINGCAST rEntry
                                               ,(PSZ)zDefunkt
                                               ,(PSZ)WXSTRINGCAST rSection
                                               ,(PSZ)WXSTRINGCAST rEntry
                                               ,(PSZ)zDefunkt
-                                              ,(void*)wxBuffer
+                                              ,(PVOID)zBuf
                                               ,1000
                                              );
                                               ,1000
                                              );
-            if (n == 0L || wxStrcmp(wxBuffer, zDefunkt) == 0)
+            if (zBuf == NULL)
+                return FALSE;
+            if (n == 0L || wxStrcmp(zBuf, zDefunkt) == 0)
                 return FALSE;
                 return FALSE;
+            zBuf[n-1] = '\0';
         }
         else
             return FALSE;
         }
         else
             return FALSE;
@@ -405,15 +458,16 @@ bool wxGetResource(
                                           ,(PSZ)WXSTRINGCAST rSection
                                           ,(PSZ)WXSTRINGCAST rEntry
                                           ,(PSZ)zDefunkt
                                           ,(PSZ)WXSTRINGCAST rSection
                                           ,(PSZ)WXSTRINGCAST rEntry
                                           ,(PSZ)zDefunkt
-                                          ,(void*)wxBuffer
+                                          ,(PVOID)zBuf
                                           ,1000
                                          );
                                           ,1000
                                          );
-        if (n == 0L || wxStrcmp(wxBuffer, zDefunkt) == 0)
+        if (zBuf == NULL)
             return FALSE;
             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;
 }
 
     return TRUE;
 }
 
@@ -425,6 +479,8 @@ bool wxGetResource(
 )
 {
     wxChar*                         zStr = NULL;
 )
 {
     wxChar*                         zStr = NULL;
+
+    zStr = new wxChar[1000];
     bool                            bSucc = wxGetResource( rSection
                                                           ,rEntry
                                                           ,(wxChar **)&zStr
     bool                            bSucc = wxGetResource( rSection
                                                           ,rEntry
                                                           ,(wxChar **)&zStr
@@ -437,7 +493,11 @@ bool wxGetResource(
         delete[] zStr;
         return TRUE;
     }
         delete[] zStr;
         return TRUE;
     }
-    else return FALSE;
+    else
+    {
+        delete[] zStr;
+        return FALSE;
+    }
 }
 
 bool wxGetResource(
 }
 
 bool wxGetResource(
@@ -448,6 +508,8 @@ bool wxGetResource(
 )
 {
     wxChar*                           zStr = NULL;
 )
 {
     wxChar*                           zStr = NULL;
+
+    zStr = new wxChar[1000];
     bool                              bSucc = wxGetResource( rSection
                                                             ,rEntry
                                                             ,(wxChar **)&zStr
     bool                              bSucc = wxGetResource( rSection
                                                             ,rEntry
                                                             ,(wxChar **)&zStr
@@ -460,7 +522,11 @@ bool wxGetResource(
         delete[] zStr;
         return TRUE;
     }
         delete[] zStr;
         return TRUE;
     }
-    else return FALSE;
+    else
+    {
+        delete[] zStr;
+        return FALSE;
+    }
 }
 
 bool wxGetResource(
 }
 
 bool wxGetResource(
@@ -471,6 +537,8 @@ bool wxGetResource(
 )
 {
     wxChar*                         zStr = NULL;
 )
 {
     wxChar*                         zStr = NULL;
+
+    zStr = new wxChar[1000];
     bool                            bSucc = wxGetResource( rSection
                                                           ,rEntry
                                                           ,(wxChar **)&zStr
     bool                            bSucc = wxGetResource( rSection
                                                           ,rEntry
                                                           ,(wxChar **)&zStr
@@ -483,7 +551,11 @@ bool wxGetResource(
         delete[] zStr;
         return TRUE;
     }
         delete[] zStr;
         return TRUE;
     }
-    else return FALSE;
+    else
+    {
+        delete[] zStr;
+        return FALSE;
+    }
 }
 #endif // wxUSE_RESOURCES
 
 }
 #endif // wxUSE_RESOURCES
 
@@ -559,6 +631,8 @@ wxChar* wxGetUserHome (
     wxChar*                         zHome;
     wxString                        sUser1(rUser);
 
     wxChar*                         zHome;
     wxString                        sUser1(rUser);
 
+    wxBuffer = new wxChar[256];
+#ifndef __EMX__
     if (sUser1 != _T(""))
     {
         wxChar                      zTmp[64];
     if (sUser1 != _T(""))
     {
         wxChar                      zTmp[64];
@@ -573,20 +647,27 @@ wxChar* wxGetUserHome (
                 if ((zHome = wxGetenv(_T("TMP"))) != NULL    ||
                     (zHome = wxGetenv(_T("TMPDIR"))) != NULL ||
                     (zHome = wxGetenv(_T("TEMP"))) != NULL)
                 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("");
         }
     }
                     return *zHome ? zHome : (wxChar*)_T("\\");
             }
             if (wxStricmp(zTmp, WXSTRINGCAST sUser1) == 0)
                 sUser1 = _T("");
         }
     }
+#endif
     if (sUser1 == _T(""))
     if (sUser1 == _T(""))
+    {
         if ((zHome = wxGetenv(_T("HOME"))) != NULL)
         {
             wxStrcpy(wxBuffer, zHome);
             Unix2DosFilename(wxBuffer);
         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
 }
 
 // Check whether this window wants to process messages, e.g. Stop button
@@ -598,8 +679,8 @@ bool wxCheckForInterrupt(
     if(pWnd)
     {
         QMSG                        vMsg;
     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))
         HWND                        hwndWin= (HWND) pWnd->GetHWND();
 
         while(::WinPeekMsg(hab, &vMsg, hwndFilter, 0, 0, PM_REMOVE))
@@ -667,12 +748,16 @@ void wxDisplaySize(
 {
     HPS                             hpsScreen;
     HDC                             hdcScreen;
 {
     HPS                             hpsScreen;
     HDC                             hdcScreen;
+    LONG                            lWidth;
+    LONG                            lHeight;
 
     hpsScreen = ::WinGetScreenPS(HWND_DESKTOP);
     hdcScreen = ::GpiQueryDevice(hpsScreen);
 
     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);
     DevCloseDC(hdcScreen);
+    *pWidth = (int)lWidth;
+    *pHeight = (int)lHeight;
 }
 
 bool wxDirExists(
 }
 
 bool wxDirExists(