]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/utils.cpp
make wxSelectDispatcher ctor public, it can be useful to create it in places other...
[wxWidgets.git] / src / os2 / utils.cpp
index 091c160fec0ed431d21c8cbce92a2324ebc64ec2..e3bc440f2714d8cafe12dd5a4bf423ce4f7a36c6 100644 (file)
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
+#include "wx/utils.h"
+
 #ifndef WX_PRECOMP
-    #include "wx/utils.h"
-    #include "wx/app.h"
+    #include "wx/intl.h"
+    #include "wx/log.h"
 #endif  //WX_PRECOMP
 
 #include "wx/os2/private.h"
-#include "wx/intl.h"
 #include "wx/apptrait.h"
+#include "wx/filename.h"
 
 #include <ctype.h>
 #ifdef __EMX__
 #include <dirent.h>
 #endif
 
-#include "wx/log.h"
 
 #include <io.h>
 
@@ -82,7 +83,8 @@ bool wxGetHostName( wxChar* zBuf, int nMaxSize )
     wxChar*        zSysname;
     const wxChar*  zDefaultHost = _T("noname");
 
-    if ((zSysname = wxGetenv(_T("SYSTEM_NAME"))) == NULL)
+    if ((zSysname = wxGetenv(_T("SYSTEM_NAME"))) == NULL &&
+       (zSysname = wxGetenv(_T("HOSTNAME"))) == NULL)
     {
         ::PrfQueryProfileString( HINI_PROFILE
                                 ,(PSZ)WX_SECTION
@@ -135,19 +137,17 @@ int wxKill(long         lPid,
 //
 // Execute a program in an Interactive Shell
 //
-bool wxShell(
-  const wxString&                   rCommand
-)
+bool wxShell( const wxString& rCommand )
 {
-    wxChar*                         zShell = _T("CMD.EXE");
-    wxString                        sInputs;
-    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;
+    wxChar*     zShell = _T("CMD.EXE");
+    wxString    sInputs;
+    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;
@@ -157,7 +157,7 @@ bool wxShell(
     SData.PgmName  = (char*)zShell;
 
     sInputs = _T("/C ") + rCommand;
-    SData.PgmInputs     = (BYTE*)sInputs.c_str();
+    SData.PgmInputs     = (BYTE*)sInputs.wx_str();
     SData.TermQ         = 0;
     SData.Environment   = 0;
     SData.InheritOpt    = SSF_INHERTOPT_SHELL;
@@ -198,18 +198,6 @@ bool wxShutdown(wxShutdownFlags WXUNUSED(wFlags))
     return false;
 }
 
-wxPowerType wxGetPowerType()
-{
-    // TODO
-    return wxPOWER_UNKNOWN;
-}
-
-wxBatteryState wxGetBatteryState()
-{
-    // TODO
-    return wxBATTERY_UNKNOWN_STATE;
-}
-
 // Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX)
 wxMemorySize wxGetFreeMemory()
 {
@@ -238,7 +226,7 @@ unsigned long wxGetProcessId()
 bool wxGetEnv(const wxString& var, wxString *value)
 {
     // wxGetenv is defined as getenv()
-    wxChar *p = wxGetenv(var);
+    wxChar *p = wxGetenv((const wxChar *)var);
     if ( !p )
         return false;
 
@@ -250,11 +238,10 @@ bool wxGetEnv(const wxString& var, wxString *value)
     return true;
 }
 
-bool wxSetEnv(const wxString& variable, const wxChar *value)
+static bool wxDoSetEnv(const wxString& variable, const char *value)
 {
 #if defined(HAVE_SETENV)
-    return setenv(variable.mb_str(), value ? wxString(value).mb_str().data()
-                                           : NULL, 1 /* overwrite */) == 0;
+    return setenv(variable.mb_str(), value, 1 /* overwrite */) == 0;
 #elif defined(HAVE_PUTENV)
     wxString s = variable;
     if ( value )
@@ -275,6 +262,16 @@ bool wxSetEnv(const wxString& variable, const wxChar *value)
 #endif
 }
 
+bool wxSetEnv(const wxString& variable, const wxString& value)
+{
+    return wxDoSetEnv(variable, value.mb_str());
+}
+
+bool wxUnsetEnv(const wxString& variable)
+{
+    return wxDoSetEnv(variable, NULL);
+}
+
 void wxMilliSleep(
   unsigned long                     ulMilliseconds
 )
@@ -311,19 +308,18 @@ void wxBell()
 wxString wxGetOsDescription()
 {
     wxString strVer(_T("OS/2"));
-    ULONG ulSysInfo[QSV_MAX] = {0};
+    ULONG ulSysInfo = 0;
 
-    if (::DosQuerySysInfo( 1L,
-                           QSV_MAX,
-                           (PVOID)ulSysInfo,
-                           sizeof(ULONG) * QSV_MAX
+    if (::DosQuerySysInfo( QSV_VERSION_MINOR,
+                           QSV_VERSION_MINOR,
+                           (PVOID)&ulSysInfo,
+                           sizeof(ULONG)
                          ) == 0L )
     {
         wxString ver;
-        ver.Printf( _T(" ver. %d.%d rev. %c"),
-                    int(ulSysInfo[QSV_VERSION_MAJOR] / 10),
-                    int(ulSysInfo[QSV_VERSION_MINOR]),
-                    char(ulSysInfo[QSV_VERSION_REVISION])
+        ver.Printf( _T(" ver. %d.%d"),
+                    int(ulSysInfo / 10),
+                    int(ulSysInfo % 10)
                   );
         strVer += ver;
     }
@@ -331,6 +327,13 @@ wxString wxGetOsDescription()
     return strVer;
 }
 
+bool wxIsPlatform64Bit()
+{
+    // FIXME: No idea how to test for 64 bit processor
+    //        (Probably irrelevant anyhow, though).
+    return false;
+}
+
 void wxAppTraits::InitializeGui(unsigned long &WXUNUSED(ulHab))
 {
 }
@@ -339,27 +342,29 @@ void wxAppTraits::TerminateGui(unsigned long WXUNUSED(ulHab))
 {
 }
 
-wxToolkitInfo & wxConsoleAppTraits::GetToolkitInfo()
+wxOperatingSystemId wxGetOsVersion(int *verMaj, int *verMin)
 {
-    static wxToolkitInfo  vInfo;
-    ULONG                 ulSysInfo[QSV_MAX] = {0};
+    ULONG                 ulSysInfo = 0;
     APIRET                ulrc;
 
-    vInfo.name = _T("wxBase");
-    ulrc = ::DosQuerySysInfo( 1L
-                             ,QSV_MAX
-                             ,(PVOID)ulSysInfo
-                             ,sizeof(ULONG) * QSV_MAX
+    ulrc = ::DosQuerySysInfo( QSV_VERSION_MINOR,
+                              QSV_VERSION_MINOR,
+                              (PVOID)&ulSysInfo,
+                              sizeof(ULONG)
                             );
+
     if (ulrc == 0L)
     {
-        vInfo.versionMajor = ulSysInfo[QSV_VERSION_MAJOR] / 10;
-        vInfo.versionMinor = ulSysInfo[QSV_VERSION_MINOR];
+        if ( verMaj )
+            *verMaj = ulSysInfo / 10;
+        if ( verMin )
+            *verMin = ulSysInfo % 10;
     }
-    vInfo.os = wxOS2_PM;
-    return vInfo;
+
+    return wxOS_OS2;
 }
 
+
 // ---------------------------------------------------------------------------
 const wxChar* wxGetHomeDir(
   wxString*                         pStr
@@ -389,61 +394,92 @@ const wxChar* wxGetHomeDir(
     return rStrDir.c_str();
 }
 
-// Hack for OS/2
-#if wxUSE_UNICODE
-const wxMB2WXbuf wxGetUserHome( const wxString &rUser )
-#else // just for binary compatibility -- there is no 'const' here
-wxChar* wxGetUserHome ( const wxString &rUser )
-#endif
+wxString wxGetUserHome ( const wxString &rUser )
 {
     wxChar*    zHome;
-    wxString   sUser1(rUser);
+    wxString   sUser(rUser);
+
+    wxString home;
 
-    wxChar *wxBuffer = new wxChar[256];
 #ifndef __EMX__
-    if (!sUser1.empty())
+    if (!sUser.empty())
     {
-        wxChar                      zTmp[64];
+        const wxString currentUser = wxGetUserId();
 
-        if (wxGetUserId( zTmp
-                        ,sizeof(zTmp)/sizeof(char)
-                       ))
+        // Guests belong in the temp dir
+        if ( currentUser == "annonymous" )
         {
-            // Guests belong in the temp dir
-            if (wxStricmp(zTmp, _T("annonymous")) == 0)
-            {
-                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 = wxEmptyString;
+            zHome = wxGetenv(_T("TMP"));
+            if ( !zHome )
+                zHome = wxGetenv(_T("TMPDIR"));
+            if ( !zHome )
+                zHome = wxGetenv(_T("TEMP"));
+
+            if ( zHome && *zHome )
+                return zHome;
         }
+
+        if ( sUser == currentUser )
+            sUser.clear();
     }
 #endif
-    if (sUser1.empty())
+    if (sUser.empty())
     {
         if ((zHome = wxGetenv(_T("HOME"))) != NULL)
         {
-            wxStrcpy(wxBuffer, zHome);
-            wxUnix2DosFilename(wxBuffer);
-#if wxUSE_UNICODE
-            wxWCharBuffer retBuffer (wxBuffer);
-            delete[] wxBuffer;
-            return retBuffer;
-#else
-            wxStrcpy(zHome, wxBuffer);
-            delete[] wxBuffer;
-            return zHome;
-#endif
+            home = zHome;
+            home.Replace("/", "\\");
         }
     }
-    delete[] wxBuffer;
-    return (wxChar*)wxEmptyString; // No home known!
+
+    return home;
 }
 
+bool wxGetDiskSpace(const wxString& path,
+                    wxDiskspaceSize_t *pTotal,
+                    wxDiskspaceSize_t *pFree)
+{
+    if (path.empty())
+        return false;
+
+    wxFileName fn(path);
+    FSALLOCATE fsaBuf = {0};
+    APIRET rc = NO_ERROR;
+    ULONG disknum = 0;
+
+    fn.MakeAbsolute();
+
+    if (wxDirExists(fn.GetFullPath()) == false)
+        return false;
+
+    disknum = wxToupper(fn.GetVolume().GetChar(0)) - _T('A') + 1;
+
+    rc = ::DosQueryFSInfo(disknum,             // 1 = A, 2 = B, 3 = C, ...
+                          FSIL_ALLOC,          // allocation info
+                          (PVOID)&fsaBuf,
+                          sizeof(FSALLOCATE));
+
+    if (rc != NO_ERROR)
+        return false;
+    else
+    {
+        if(pTotal)
+        {
+           // to try to avoid 32-bit overflow, let's not multiply right away
+            // (num of alloc units)
+            *pTotal = fsaBuf.cUnit;  
+            // * (num of sectors per alloc unit) * (num of bytes per sector)
+            (*pTotal) *= fsaBuf.cSectorUnit * fsaBuf.cbSector;
+        }
+        if(pFree)
+        {
+            *pFree = fsaBuf.cUnitAvail;
+            (*pFree) *= fsaBuf.cSectorUnit * fsaBuf.cbSector;
+        }
+        return true;
+    }
+}
 wxString wxPMErrorToStr(ERRORID vError)
 {
     wxString sError;
@@ -494,6 +530,106 @@ wxString wxPMErrorToStr(ERRORID vError)
             sError = wxT("Valid name format, but cannot find name in atom table");
             break;
 
+        case PMERR_INV_HPS:
+            sError = wxT("PMERR_INV_HPS");
+            break;
+
+        case PMERR_PS_BUSY:
+            sError = wxT("PMERR_PS_BUSY");
+            break;
+
+        case PMERR_INV_PRIMITIVE_TYPE:
+            sError = wxT("PMERR_INV_PRIMITIVE_TYPE");
+            break;
+
+        case PMERR_UNSUPPORTED_ATTR:
+            sError = wxT("PMERR_UNSUPPORTED_ATTR");
+            break;
+
+        case PMERR_INV_COLOR_ATTR:
+            sError = wxT("PMERR_INV_COLOR_ATTR");
+            break;
+
+        case PMERR_INV_BACKGROUND_COL_ATTR:
+            sError = wxT("PMERR_INV_BACKGROUND_COL_ATTR");
+            break;
+
+        case PMERR_INV_MIX_ATTR:
+            sError = wxT("PMERR_INV_MIX_ATTR");
+            break;
+
+        case PMERR_INV_LINE_WIDTH_ATTR:
+            sError = wxT("PMERR_INV_LINE_WIDTH_ATTR");
+            break;
+
+        case PMERR_INV_GEOM_LINE_WIDTH_ATTR:
+            sError = wxT("PMERR_INV_GEOM_LINE_WIDTH_ATTR");
+            break;
+
+        case PMERR_INV_LINE_TYPE_ATTR:
+            sError = wxT("PMERR_INV_LINE_TYPE_ATTR");
+            break;
+
+        case PMERR_INV_LINE_END_ATTR:
+            sError = wxT("PMERR_INV_LINE_END_ATTR");
+            break;
+
+        case PMERR_INV_LINE_JOIN_ATTR:
+            sError = wxT("PMERR_INV_LINE_JOIN_ATTR");
+            break;
+
+        case PMERR_INV_CHAR_SET_ATTR:
+            sError = wxT("PMERR_INV_CHAR_SET_ATTR");
+            break;
+
+        case PMERR_INV_CHAR_MODE_ATTR:
+            sError = wxT("PMERR_INV_CHAR_MODE_ATTR");
+            break;
+
+        case PMERR_INV_CHAR_DIRECTION_ATTR:
+            sError = wxT("PMERR_INV_CHAR_DIRECTION_ATTR");
+            break;
+
+        case PMERR_INV_CHAR_SHEAR_ATTR:
+            sError = wxT("PMERR_INV_CHAR_SHEAR_ATTR");
+            break;
+
+        case PMERR_INV_CHAR_ANGLE_ATTR:
+            sError = wxT("PMERR_INV_CHAR_ANGLE_ATTR");
+            break;
+
+        case PMERR_INV_MARKER_SET_ATTR:
+            sError = wxT("PMERR_INV_MARKER_SET_ATTR");
+            break;
+
+        case PMERR_INV_MARKER_SYMBOL_ATTR:
+            sError = wxT("PMERR_INV_MARKER_SYMBOL_ATTR");
+            break;
+
+        case PMERR_INV_PATTERN_SET_ATTR:
+            sError = wxT("PMERR_INV_PATTERN_SET_ATTR");
+            break;
+
+        case PMERR_INV_PATTERN_ATTR:
+            sError = wxT("PMERR_INV_PATTERN_ATTR");
+            break;
+
+        case PMERR_INV_COORDINATE:
+            sError = wxT("PMERR_INV_COORDINATE");
+            break;
+
+        case PMERR_UNSUPPORTED_ATTR_VALUE:
+            sError = wxT("PMERR_UNSUPPORTED_ATTR_VALUE");
+            break;
+
+        case PMERR_INV_PATTERN_SET_FONT:
+            sError = wxT("PMERR_INV_PATTERN_SET_FONT");
+            break;
+
+        case PMERR_HUGE_FONTS_NOT_SUPPORTED:
+            sError = wxT("PMERR_HUGE_FONTS_NOT_SUPPORTED");
+            break;
+
         default:
             sError = wxT("Unknown error");
     }