1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/os2/utils.cpp 
   3 // Purpose:     Various utilities 
   4 // Author:      David Webster 
   8 // Copyright:   (c) David Webster 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // For compilers that support precompilation, includes "wx.h". 
  13 #include "wx/wxprec.h" 
  22 #include "wx/os2/private.h" 
  23 #include "wx/apptrait.h" 
  24 #include "wx/filename.h" 
  42 #if defined(__WATCOMC__) 
  47 #elif !defined(__EMX__) 
  53 static const wxChar WX_SECTION
[] = _T("wxWidgets"); 
  54 static const wxChar eHOSTNAME
[]  = _T("HostName"); 
  56 // For the following functions we SHOULD fill in support 
  57 // for Windows-NT (which I don't know) as I assume it begin 
  58 // a POSIX Unix (so claims MS) that it has some special 
  59 // functions beyond those provided by WinSock 
  61 // Get full hostname (eg. DoDo.BSn-Germany.crg.de) 
  62 bool wxGetHostName( wxChar
* zBuf
, int nMaxSize 
) 
  64     if (!zBuf
) return false; 
  66 #if defined(wxUSE_NET_API) && wxUSE_NET_API 
  69     unsigned long  ulLevel 
= 0; 
  70     unsigned char* zBuffer 
= NULL
; 
  71     unsigned long  ulBuffer 
= 256; 
  72     unsigned long* pulTotalAvail 
= NULL
; 
  74     NetBios32GetInfo( (const unsigned char*)zServer
 
  75                      ,(const unsigned char*)zComputer
 
  81     strcpy(zBuf
, zServer
); 
  84     const wxChar
*  zDefaultHost 
= _T("noname"); 
  86     if ((zSysname 
= wxGetenv(_T("SYSTEM_NAME"))) == NULL 
&& 
  87         (zSysname 
= wxGetenv(_T("HOSTNAME"))) == NULL
) 
  89         ::PrfQueryProfileString( HINI_PROFILE
 
  99         wxStrncpy(zBuf
, zSysname
, nMaxSize 
- 1); 
 102     zBuf
[nMaxSize
] = _T('\0'); 
 105     return *zBuf 
? true : false; 
 108 // Get user ID e.g. jacs 
 109 bool wxGetUserId(wxChar
* zBuf
, int nType
) 
 111 #if defined(__VISAGECPP__) || defined(__WATCOMC__) 
 112     // UPM procs return 0 on success 
 113     long lrc 
= U32ELOCU((PUCHAR
)zBuf
, (PULONG
)&nType
); 
 114     if (lrc 
== 0) return true; 
 119 bool wxGetUserName( wxChar
* zBuf
, int nMaxSize 
) 
 122     wxGetUserId( zBuf
, nMaxSize 
); 
 124     wxStrncpy(zBuf
, _T("Unknown User"), nMaxSize
); 
 129 int wxKill(long         lPid
, 
 130            wxSignal     
WXUNUSED(eSig
), 
 131            wxKillError
* WXUNUSED(peError
), 
 134     return((int)::DosKillProcess(0, (PID
)lPid
)); 
 138 // Execute a program in an Interactive Shell 
 140 bool wxShell( const wxString
& rCommand 
) 
 142     wxChar
*     zShell 
= _T("CMD.EXE"); 
 144     STARTDATA   SData 
= {0}; 
 145     PSZ         PgmTitle 
= "Command Shell"; 
 149     UCHAR       achObjBuf
[256] = {0}; //error data if DosStart fails 
 152     SData
.Length   
= sizeof(STARTDATA
); 
 153     SData
.Related  
= SSF_RELATED_INDEPENDENT
; 
 154     SData
.FgBg     
= SSF_FGBG_FORE
; 
 155     SData
.TraceOpt 
= SSF_TRACEOPT_NONE
; 
 156     SData
.PgmTitle 
= PgmTitle
; 
 157     SData
.PgmName  
= (char*)zShell
; 
 159     sInputs 
= _T("/C ") + rCommand
; 
 160     SData
.PgmInputs     
= (BYTE
*)sInputs
.wx_str(); 
 162     SData
.Environment   
= 0; 
 163     SData
.InheritOpt    
= SSF_INHERTOPT_SHELL
; 
 164     SData
.SessionType   
= SSF_TYPE_WINDOWABLEVIO
; 
 167     SData
.PgmControl    
= SSF_CONTROL_VISIBLE 
| SSF_CONTROL_MAXIMIZE
; 
 170     SData
.InitXSize     
= 200; 
 171     SData
.InitYSize     
= 140; 
 173     SData
.ObjectBuffer  
= (char*)achObjBuf
; 
 174     SData
.ObjectBuffLen 
= (ULONG
)sizeof(achObjBuf
); 
 176     rc 
= ::DosStartSession(&SData
, &ulSessID
, &vPid
); 
 177     if (rc 
== 0 || rc 
== 457) // NO_ERROR or SMG_START_IN_BACKGROUND 
 182         ::DosGetInfoBlocks(&ptib
, &ppib
); 
 184         ::DosWaitChild( DCWA_PROCESS
 
 194 // Shutdown or reboot the PC 
 195 bool wxShutdown(wxShutdownFlags 
WXUNUSED(wFlags
)) 
 201 // Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX) 
 202 wxMemorySize 
wxGetFreeMemory() 
 204     void* pMemptr 
= NULL
; 
 209     lMemFlags 
= PAG_FREE
; 
 210     rc 
= ::DosQueryMem(pMemptr
, (PULONG
)&lSize
, &lMemFlags
); 
 213     return (wxMemorySize
)lSize
; 
 217 unsigned long wxGetProcessId() 
 219     return (unsigned long)getpid(); 
 222 // ---------------------------------------------------------------------------- 
 224 // ---------------------------------------------------------------------------- 
 226 bool wxGetEnv(const wxString
& var
, wxString 
*value
) 
 228     // wxGetenv is defined as getenv() 
 229     wxChar 
*p 
= wxGetenv((const wxChar 
*)var
); 
 241 static bool wxDoSetEnv(const wxString
& variable
, const char *value
) 
 243 #if defined(HAVE_SETENV) 
 247         return unsetenv(variable
.mb_str()) == 0;  
 249         value 
= _T(""); // mustn't pass NULL to setenv()  
 252     return setenv(variable
.mb_str(), value
, 1 /* overwrite */) == 0; 
 253 #elif defined(HAVE_PUTENV) 
 254     wxString s 
= variable
; 
 256         s 
<< _T('=') << value
; 
 259     const char *p 
= s
.mb_str(); 
 261     // the string will be free()d by libc 
 262     char *buf 
= (char *)malloc(strlen(p
) + 1); 
 265     return putenv(buf
) == 0; 
 266 #else // no way to set an env var 
 267     wxUnusedVar(variable
); 
 273 bool wxSetEnv(const wxString
& variable
, const wxString
& value
) 
 275     return wxDoSetEnv(variable
, value
.mb_str()); 
 278 bool wxUnsetEnv(const wxString
& variable
) 
 280     return wxDoSetEnv(variable
, NULL
); 
 284   unsigned long                     ulMilliseconds
 
 287     ::DosSleep(ulMilliseconds
); 
 291   unsigned long                     ulMicroseconds
 
 294     ::DosSleep(ulMicroseconds
/1000); 
 301     ::DosSleep(1000 * nSecs
); 
 304 // Consume all events until no more left 
 313     DosBeep(1000,1000); // 1kHz during 1 sec. 
 316 wxString 
wxGetOsDescription() 
 318     wxString 
strVer(_T("OS/2")); 
 321     if (::DosQuerySysInfo( QSV_VERSION_MINOR
, 
 328         ver
.Printf( _T(" ver. %d.%d"), 
 338 bool wxIsPlatform64Bit() 
 340     // FIXME: No idea how to test for 64 bit processor 
 341     //        (Probably irrelevant anyhow, though). 
 345 void wxAppTraits::InitializeGui(unsigned long &WXUNUSED(ulHab
)) 
 349 void wxAppTraits::TerminateGui(unsigned long WXUNUSED(ulHab
)) 
 353 wxOperatingSystemId 
wxGetOsVersion(int *verMaj
, int *verMin
) 
 358     ulrc 
= ::DosQuerySysInfo( QSV_VERSION_MINOR
, 
 367             *verMaj 
= ulSysInfo 
/ 10; 
 369             *verMin 
= ulSysInfo 
% 10; 
 376 // --------------------------------------------------------------------------- 
 377 const wxChar
* wxGetHomeDir( 
 381     wxString
&                       rStrDir 
= *pStr
; 
 383     // OS/2 has no idea about home, 
 384     // so use the working directory instead. 
 385     // However, we might have a valid HOME directory, 
 386     // as is used on many machines that have unix utilities 
 387     // on them, so we should use that, if available. 
 389     // 256 was taken from os2def.h 
 391 #  define MAX_PATH  256 
 394     const wxChar 
*szHome 
= wxGetenv((wxChar
*)"HOME"); 
 395     if ( szHome 
== NULL 
) { 
 396       // we're homeless, use current directory. 
 402     return rStrDir
.c_str(); 
 405 wxString 
wxGetUserHome ( const wxString 
&rUser 
) 
 408     wxString   
sUser(rUser
); 
 415         const wxString currentUser 
= wxGetUserId(); 
 417         // Guests belong in the temp dir 
 418         if ( currentUser 
== "annonymous" ) 
 420             zHome 
= wxGetenv(_T("TMP")); 
 422                 zHome 
= wxGetenv(_T("TMPDIR")); 
 424                 zHome 
= wxGetenv(_T("TEMP")); 
 426             if ( zHome 
&& *zHome 
) 
 430         if ( sUser 
== currentUser 
) 
 436         if ((zHome 
= wxGetenv(_T("HOME"))) != NULL
) 
 439             home
.Replace("/", "\\"); 
 446 bool wxGetDiskSpace(const wxString
& path
, 
 447                     wxDiskspaceSize_t 
*pTotal
, 
 448                     wxDiskspaceSize_t 
*pFree
) 
 454     FSALLOCATE fsaBuf 
= {0}; 
 455     APIRET rc 
= NO_ERROR
; 
 460     if (wxDirExists(fn
.GetFullPath()) == false) 
 463     disknum 
= wxToupper(fn
.GetVolume().GetChar(0)) - _T('A') + 1; 
 465     rc 
= ::DosQueryFSInfo(disknum
,             // 1 = A, 2 = B, 3 = C, ... 
 466                           FSIL_ALLOC
,          // allocation info 
 476            // to try to avoid 32-bit overflow, let's not multiply right away 
 477             // (num of alloc units) 
 478             *pTotal 
= fsaBuf
.cUnit
;   
 479             // * (num of sectors per alloc unit) * (num of bytes per sector) 
 480             (*pTotal
) *= fsaBuf
.cSectorUnit 
* fsaBuf
.cbSector
; 
 484             *pFree 
= fsaBuf
.cUnitAvail
; 
 485             (*pFree
) *= fsaBuf
.cSectorUnit 
* fsaBuf
.cbSector
; 
 491 wxString 
wxPMErrorToStr(ERRORID vError
) 
 496     // Remove the high order byte -- it is useless 
 498     vError 
&= 0x0000ffff; 
 501         case PMERR_INVALID_HWND
: 
 502             sError 
= wxT("Invalid window handle specified"); 
 505         case PMERR_INVALID_FLAG
: 
 506             sError 
= wxT("Invalid flag bit set"); 
 509         case PMERR_NO_MSG_QUEUE
: 
 510             sError 
= wxT("No message queue available"); 
 513         case PMERR_INVALID_PARM
: 
 514             sError 
= wxT("Parameter contained invalid data"); 
 517         case PMERR_INVALID_PARAMETERS
: 
 518             sError 
= wxT("Parameter value is out of range"); 
 521         case PMERR_PARAMETER_OUT_OF_RANGE
: 
 522             sError 
= wxT("Parameter value is out of range"); 
 525         case PMERR_INVALID_INTEGER_ATOM
: 
 526             sError 
= wxT("Not a valid atom"); 
 529         case PMERR_INVALID_HATOMTBL
: 
 530             sError 
= wxT("Atom table handle is invalid"); 
 533         case PMERR_INVALID_ATOM_NAME
: 
 534             sError 
= wxT("Not a valid atom name"); 
 537         case PMERR_ATOM_NAME_NOT_FOUND
: 
 538             sError 
= wxT("Valid name format, but cannot find name in atom table"); 
 542             sError 
= wxT("PMERR_INV_HPS"); 
 546             sError 
= wxT("PMERR_PS_BUSY"); 
 549         case PMERR_INV_PRIMITIVE_TYPE
: 
 550             sError 
= wxT("PMERR_INV_PRIMITIVE_TYPE"); 
 553         case PMERR_UNSUPPORTED_ATTR
: 
 554             sError 
= wxT("PMERR_UNSUPPORTED_ATTR"); 
 557         case PMERR_INV_COLOR_ATTR
: 
 558             sError 
= wxT("PMERR_INV_COLOR_ATTR"); 
 561         case PMERR_INV_BACKGROUND_COL_ATTR
: 
 562             sError 
= wxT("PMERR_INV_BACKGROUND_COL_ATTR"); 
 565         case PMERR_INV_MIX_ATTR
: 
 566             sError 
= wxT("PMERR_INV_MIX_ATTR"); 
 569         case PMERR_INV_LINE_WIDTH_ATTR
: 
 570             sError 
= wxT("PMERR_INV_LINE_WIDTH_ATTR"); 
 573         case PMERR_INV_GEOM_LINE_WIDTH_ATTR
: 
 574             sError 
= wxT("PMERR_INV_GEOM_LINE_WIDTH_ATTR"); 
 577         case PMERR_INV_LINE_TYPE_ATTR
: 
 578             sError 
= wxT("PMERR_INV_LINE_TYPE_ATTR"); 
 581         case PMERR_INV_LINE_END_ATTR
: 
 582             sError 
= wxT("PMERR_INV_LINE_END_ATTR"); 
 585         case PMERR_INV_LINE_JOIN_ATTR
: 
 586             sError 
= wxT("PMERR_INV_LINE_JOIN_ATTR"); 
 589         case PMERR_INV_CHAR_SET_ATTR
: 
 590             sError 
= wxT("PMERR_INV_CHAR_SET_ATTR"); 
 593         case PMERR_INV_CHAR_MODE_ATTR
: 
 594             sError 
= wxT("PMERR_INV_CHAR_MODE_ATTR"); 
 597         case PMERR_INV_CHAR_DIRECTION_ATTR
: 
 598             sError 
= wxT("PMERR_INV_CHAR_DIRECTION_ATTR"); 
 601         case PMERR_INV_CHAR_SHEAR_ATTR
: 
 602             sError 
= wxT("PMERR_INV_CHAR_SHEAR_ATTR"); 
 605         case PMERR_INV_CHAR_ANGLE_ATTR
: 
 606             sError 
= wxT("PMERR_INV_CHAR_ANGLE_ATTR"); 
 609         case PMERR_INV_MARKER_SET_ATTR
: 
 610             sError 
= wxT("PMERR_INV_MARKER_SET_ATTR"); 
 613         case PMERR_INV_MARKER_SYMBOL_ATTR
: 
 614             sError 
= wxT("PMERR_INV_MARKER_SYMBOL_ATTR"); 
 617         case PMERR_INV_PATTERN_SET_ATTR
: 
 618             sError 
= wxT("PMERR_INV_PATTERN_SET_ATTR"); 
 621         case PMERR_INV_PATTERN_ATTR
: 
 622             sError 
= wxT("PMERR_INV_PATTERN_ATTR"); 
 625         case PMERR_INV_COORDINATE
: 
 626             sError 
= wxT("PMERR_INV_COORDINATE"); 
 629         case PMERR_UNSUPPORTED_ATTR_VALUE
: 
 630             sError 
= wxT("PMERR_UNSUPPORTED_ATTR_VALUE"); 
 633         case PMERR_INV_PATTERN_SET_FONT
: 
 634             sError 
= wxT("PMERR_INV_PATTERN_SET_FONT"); 
 637         case PMERR_HUGE_FONTS_NOT_SUPPORTED
: 
 638             sError 
= wxT("PMERR_HUGE_FONTS_NOT_SUPPORTED"); 
 642             sError 
= wxT("Unknown error"); 
 645 } // end of wxPMErrorToStr 
 647 // replacement for implementation in unix/utilsunx.cpp, 
 648 // to be used by all X11 based ports. 
 649 struct wxEndProcessData
; 
 651 void wxHandleProcessTermination(wxEndProcessData 
*WXUNUSED(proc_data
)) 
 653     // For now, just do nothing. To be filled in as needed.