X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2173b18fc874406b56eeb8676980f6996f7546c1..c0da0dbabf2d3cf8e1a76a2c82608822d15d0625:/src/os2/utils.cpp diff --git a/src/os2/utils.cpp b/src/os2/utils.cpp index d77c05e60d..cc0812db27 100644 --- a/src/os2/utils.cpp +++ b/src/os2/utils.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: utils.cpp +// Name: src/os2/utils.cpp // Purpose: Various utilities // Author: David Webster // Modified by: @@ -12,22 +12,22 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" +#include "wx/utils.h" + #ifndef WX_PRECOMP - #include "wx/setup.h" - #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 #ifdef __EMX__ #include #endif -#include "wx/log.h" #include @@ -39,16 +39,19 @@ #define PURE_32 -#ifndef __EMX__ -#include -#include -#include +#if defined(__WATCOMC__) +extern "C" +{ + #include +} +#elif !defined(__EMX__) + #include + #include + #include #endif static const wxChar WX_SECTION[] = _T("wxWidgets"); static const wxChar eHOSTNAME[] = _T("HostName"); -static const wxChar eUSERID[] = _T("UserId"); -static const wxChar eUSERNAME[] = _T("UserName"); // For the following functions we SHOULD fill in support // for Windows-NT (which I don't know) as I assume it begin @@ -56,18 +59,17 @@ static const wxChar eUSERNAME[] = _T("UserName"); // functions beyond those provided by WinSock // Get full hostname (eg. DoDo.BSn-Germany.crg.de) -bool wxGetHostName( - wxChar* zBuf -, int nMaxSize -) +bool wxGetHostName( wxChar* zBuf, int nMaxSize ) { -#if wxUSE_NET_API - char zServer[256]; - char zComputer[256]; - unsigned long ulLevel = 0; - unsigned char* zBuffer = NULL; - unsigned long ulBuffer = 256; - unsigned long* pulTotalAvail = NULL; + if (!zBuf) return false; + +#if defined(wxUSE_NET_API) && wxUSE_NET_API + char zServer[256]; + char zComputer[256]; + 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 @@ -78,10 +80,11 @@ bool wxGetHostName( ); strcpy(zBuf, zServer); #else - wxChar* zSysname; - const wxChar* zDefaultHost = _T("noname"); + 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 @@ -92,48 +95,41 @@ bool wxGetHostName( ); } else + { wxStrncpy(zBuf, zSysname, nMaxSize - 1); + } + zBuf[nMaxSize] = _T('\0'); #endif + return *zBuf ? true : false; } // Get user ID e.g. jacs -bool wxGetUserId( - wxChar* zBuf -, int nType -) +bool wxGetUserId(wxChar* zBuf, int nType) { -#if defined(__VISAGECPP__) - long lrc; +#if defined(__VISAGECPP__) || defined(__WATCOMC__) // UPM procs return 0 on success - lrc = U32ELOCU((unsigned char*)zBuf, (unsigned long *)&nType); + long lrc = U32ELOCU((PUCHAR)zBuf, (PULONG)&nType); if (lrc == 0) return true; #endif return false; } -bool wxGetUserName( - wxChar* zBuf -, int nMaxSize -) +bool wxGetUserName( wxChar* zBuf, int nMaxSize ) { #ifdef USE_NET_API - wxGetUserId( zBuf - ,nMaxSize - ); + wxGetUserId( zBuf, nMaxSize ); #else wxStrncpy(zBuf, _T("Unknown User"), nMaxSize); #endif return true; } -int wxKill( - long lPid -, wxSignal eSig -, wxKillError* peError -, int flags -) +int wxKill(long lPid, + wxSignal WXUNUSED(eSig), + wxKillError* WXUNUSED(peError), + int WXUNUSED(flags)) { return((int)::DosKillProcess(0, (PID)lPid)); } @@ -141,19 +137,17 @@ int wxKill( // // 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; @@ -198,31 +192,19 @@ bool wxShell( } // Shutdown or reboot the PC -bool wxShutdown(wxShutdownFlags wFlags) +bool wxShutdown(wxShutdownFlags WXUNUSED(wFlags)) { // TODO 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() { - void* pMemptr = NULL; - LONG lSize; - ULONG lMemFlags; - APIRET rc; + void* pMemptr = NULL; + LONG lSize; + ULONG lMemFlags; + APIRET rc; lMemFlags = PAG_FREE; rc = ::DosQueryMem(pMemptr, (PULONG)&lSize, &lMemFlags); @@ -275,6 +257,8 @@ bool wxSetEnv(const wxString& variable, const wxChar *value) return putenv(buf) == 0; #else // no way to set an env var + wxUnusedVar(variable); + wxUnusedVar(value); return false; #endif } @@ -306,98 +290,72 @@ void wxFlushEvents() // wxYield(); } -#if WXWIN_COMPATIBILITY_2_2 - -// Output a debug mess., in a system dependent fashion. -void wxDebugMsg( - const wxChar* zFmt ... -) +// Emit a beeeeeep +void wxBell() { - va_list vAp; - static wxChar zBuffer[512]; - - if (!wxTheApp->GetWantDebugOutput()) - return ; - va_start(vAp, zFmt); - sprintf(zBuffer, zFmt, vAp) ; - va_end(vAp); + DosBeep(1000,1000); // 1kHz during 1 sec. } -// Non-fatal error: pop up message box and (possibly) continue -void wxError( - const wxString& rMsg -, const wxString& rTitle -) +wxString wxGetOsDescription() { - wxChar *wxBuffer = new wxChar[256]; - wxSprintf(wxBuffer, "%s\nContinue?", WXSTRINGCAST rMsg); - if (::WinMessageBox( HWND_DESKTOP - ,NULL - ,(PSZ)wxBuffer - ,(PSZ)WXSTRINGCAST rTitle - ,0 - ,MB_ICONEXCLAMATION | MB_YESNO - ) == MBID_YES) - delete[] wxBuffer; - wxExit(); -} + wxString strVer(_T("OS/2")); + ULONG ulSysInfo = 0; + + if (::DosQuerySysInfo( QSV_VERSION_MINOR, + QSV_VERSION_MINOR, + (PVOID)&ulSysInfo, + sizeof(ULONG) + ) == 0L ) + { + wxString ver; + ver.Printf( _T(" ver. %d.%d"), + int(ulSysInfo / 10), + int(ulSysInfo % 10) + ); + strVer += ver; + } -// Fatal error: pop up message box and abort -void wxFatalError( - const wxString& rMsg -, const wxString& rTitle -) -{ - unsigned long ulRc; - - ulRc = ::WinMessageBox( HWND_DESKTOP - ,NULL - ,WXSTRINGCAST rMsg - ,WXSTRINGCAST rTitle - ,0 - ,MB_NOICON | MB_OK - ); - DosExit(EXIT_PROCESS, ulRc); + return strVer; } -#endif // WXWIN_COMPATIBILITY_2_2 - -// Emit a beeeeeep -void wxBell() +bool wxIsPlatform64Bit() { - DosBeep(1000,1000); // 1kHz during 1 sec. + // FIXME: No idea how to test for 64 bit processor + // (Probably irrelevant anyhow, though). + return false; } - -void wxAppTraits::InitializeGui(unsigned long &ulHab) +void wxAppTraits::InitializeGui(unsigned long &WXUNUSED(ulHab)) { } -void wxAppTraits::TerminateGui(unsigned long ulHab) +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 @@ -434,8 +392,8 @@ const wxMB2WXbuf wxGetUserHome( const wxString &rUser ) wxChar* wxGetUserHome ( const wxString &rUser ) #endif { - wxChar* zHome; - wxString sUser1(rUser); + wxChar* zHome; + wxString sUser1(rUser); wxChar *wxBuffer = new wxChar[256]; #ifndef __EMX__ @@ -457,7 +415,7 @@ wxChar* wxGetUserHome ( const wxString &rUser ) return *zHome ? zHome : (wxChar*)_T("\\"); } if (wxStricmp(zTmp, WXSTRINGCAST sUser1) == 0) - sUser1 = _T(""); + sUser1 = wxEmptyString; } } #endif @@ -468,10 +426,10 @@ wxChar* wxGetUserHome ( const wxString &rUser ) wxStrcpy(wxBuffer, zHome); wxUnix2DosFilename(wxBuffer); #if wxUSE_UNICODE - wxWCharBuffer retBuffer (wxBuffer); + wxWCharBuffer retBuffer (wxBuffer); delete[] wxBuffer; return retBuffer; -#else +#else wxStrcpy(zHome, wxBuffer); delete[] wxBuffer; return zHome; @@ -482,11 +440,54 @@ wxChar* wxGetUserHome ( const wxString &rUser ) return (wxChar*)wxEmptyString; // No home known! } -wxString WXDLLEXPORT wxPMErrorToStr( - ERRORID vError -) +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 = 1 + wxToupper(fn.GetVolume().GetChar(0)) - _T('A'); + + 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; + wxString sError; // // Remove the high order byte -- it is useless @@ -534,17 +535,117 @@ wxString WXDLLEXPORT wxPMErrorToStr( 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"); } - return(sError); + return sError; } // end of wxPMErrorToStr // replacement for implementation in unix/utilsunx.cpp, // to be used by all X11 based ports. struct wxEndProcessData; -void wxHandleProcessTermination(wxEndProcessData *proc_data) +void wxHandleProcessTermination(wxEndProcessData *WXUNUSED(proc_data)) { // For now, just do nothing. To be filled in as needed. }