]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/utils.cpp
Removed a deprecated wxBitmap constructor, and some
[wxWidgets.git] / src / msw / utils.cpp
index 0ae445411ba2ce39758939c434d7c7fb5092a325..30e41428af6c3e724ed8885b461bcdf49edeeefb 100644 (file)
@@ -5,8 +5,8 @@
 // Modified by:
 // Created:     04/01/98
 // RCS-ID:      $Id$
-// Copyright:   (c) Julian Smart and Markus Holzem
-// Licence:     wxWindows license
+// Copyright:   (c) Julian Smart
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
 #endif
 #endif  //WX_PRECOMP
 
-// In some mingws there is a missing extern "C" int the winsock header,
-// so we put it here just to be safe. Note that this must appear _before_
-// #include "wx/msw/private.h" which itself includes <windows.h>, as this
-// one in turn includes <winsock.h> unless we define WIN32_LEAN_AND_MEAN.
-//
-#if defined(__WIN32__) && !defined(__TWIN32__) && !defined(__WXMICROWIN__) && ! (defined(__GNUWIN32__) && !defined(__MINGW32__))
-extern "C" {
-    #include <winsock.h>    // we use socket functions in wxGetFullHostName()
-}
-#endif
-
 #include "wx/msw/private.h"     // includes <windows.h>
 
+#ifdef __GNUWIN32_OLD__
+    // apparently we need to include winsock.h to get WSADATA and other stuff
+    // used in wxGetFullHostName() with the old mingw32 versions
+    #include <winsock.h>
+#endif
+
 #include "wx/timer.h"
 
-#if !defined(__GNUWIN32__) && !defined(__WXWINE__) && !defined(__SALFORDC__) && !defined(__WXMICROWIN__)
+#if !defined(__GNUWIN32__) && !defined(__SALFORDC__) && !defined(__WXMICROWIN__)
     #include <direct.h>
 
     #ifndef __MWERKS__
@@ -83,8 +78,10 @@ extern "C" {
     #include <lm.h>
 #endif // USE_NET_API
 
-#if defined(__WIN32__) && !defined(__WXWINE__) && !defined(__WXMICROWIN__)
-    #include <io.h>
+#if defined(__WIN32__) && !defined(__WXMICROWIN__)
+    #ifndef __UNIX__
+        #include <io.h>
+    #endif
 
     #ifndef __GNUWIN32__
         #include <shellapi.h>
@@ -178,6 +175,11 @@ bool wxGetFullHostName(wxChar *buf, int maxSize)
 {
 #if defined(__WIN32__) && !defined(__TWIN32__) && !defined(__WXMICROWIN__) && ! (defined(__GNUWIN32__) && !defined(__MINGW32__))
     // TODO should use GetComputerNameEx() when available
+
+    // the idea is that if someone had set wxUSE_SOCKETS to 0 the code
+    // shouldn't use winsock.dll (a.k.a. ws2_32.dll) at all so only use this
+    // code if we link with it anyhow
+#if wxUSE_SOCKETS
     WSADATA wsa;
     if ( WSAStartup(MAKEWORD(1, 1), &wsa) == 0 )
     {
@@ -194,25 +196,27 @@ bool wxGetFullHostName(wxChar *buf, int maxSize)
                 if ( pHostEnt )
                 {
                     // Windows will use DNS internally now
-                    pHostEnt = gethostbyaddr(pHostEnt->h_addr, 4, PF_INET);
+                    pHostEnt = gethostbyaddr(pHostEnt->h_addr, 4, AF_INET);
                 }
 
                 if ( pHostEnt )
                 {
-                    host = pHostEnt->h_name;
+                    host = wxString::FromAscii(pHostEnt->h_name);
                 }
             }
         }
 
         WSACleanup();
 
-        if ( !!host )
+        if ( !host.empty() )
         {
             wxStrncpy(buf, host, maxSize);
 
             return TRUE;
         }
     }
+#endif // wxUSE_SOCKETS
+
 #endif // Win32
 
     return wxGetHostName(buf, maxSize);
@@ -382,25 +386,55 @@ const wxChar* wxGetHomeDir(wxString *pstr)
     #endif
   #else   // Windows
     #ifdef  __WIN32__
-      const wxChar *szHome = wxGetenv(wxT("HOMEDRIVE"));
+      strDir.clear();
+
+      // If we have a valid HOME directory, as is used on many machines that
+      // have unix utilities on them, we should use that.
+      const wxChar *szHome = wxGetenv(wxT("HOME"));
+
       if ( szHome != NULL )
-        strDir << szHome;
-      szHome = wxGetenv(wxT("HOMEPATH"));
-      if ( szHome != NULL ) {
-        strDir << szHome;
-
-        // the idea is that under NT these variables have default values
-        // of "%systemdrive%:" and "\\". As we don't want to create our
-        // config files in the root directory of the system drive, we will
-        // create it in our program's dir. However, if the user took care
-        // to set HOMEPATH to something other than "\\", we suppose that he
-        // knows what he is doing and use the supplied value.
-        if ( wxStrcmp(szHome, wxT("\\")) != 0 )
-          return strDir.c_str();
+      {
+        strDir = szHome;
+      }
+      else // no HOME, try HOMEDRIVE/PATH
+      {
+          szHome = wxGetenv(wxT("HOMEDRIVE"));
+          if ( szHome != NULL )
+            strDir << szHome;
+          szHome = wxGetenv(wxT("HOMEPATH"));
+
+          if ( szHome != NULL )
+          {
+            strDir << szHome;
+
+            // the idea is that under NT these variables have default values
+            // of "%systemdrive%:" and "\\". As we don't want to create our
+            // config files in the root directory of the system drive, we will
+            // create it in our program's dir. However, if the user took care
+            // to set HOMEPATH to something other than "\\", we suppose that he
+            // knows what he is doing and use the supplied value.
+            if ( wxStrcmp(szHome, wxT("\\")) == 0 )
+              strDir.clear();
+          }
       }
 
+      if ( strDir.empty() )
+      {
+          // If we have a valid USERPROFILE directory, as is the case in
+          // Windows NT, 2000 and XP, we should use that as our home directory.
+          szHome = wxGetenv(wxT("USERPROFILE"));
+
+          if ( szHome != NULL )
+            strDir = szHome;
+      }
+
+      if ( !strDir.empty() )
+      {
+          return strDir.c_str();
+      }
+      //else: fall back to the prograrm directory
     #else   // Win16
-      // Win16 has no idea about home, so use the working directory instead
+      // Win16 has no idea about home, so use the executable directory instead
     #endif  // WIN16/32
 
     // 260 was taken from windef.h
@@ -568,14 +602,16 @@ bool wxGetEnv(const wxString& var, wxString *value)
 {
 #ifdef __WIN16__
     const wxChar* ret = wxGetenv(var);
-    if (ret)
+    if ( !ret )
+        return FALSE;
+
+    if ( value )
     {
         *value = ret;
-        return TRUE;
     }
-    else
-        return FALSE;
-#else
+
+    return TRUE;
+#else // Win32
     // first get the size of the buffer
     DWORD dwRet = ::GetEnvironmentVariable(var, NULL, 0);
     if ( !dwRet )
@@ -591,7 +627,7 @@ bool wxGetEnv(const wxString& var, wxString *value)
     }
 
     return TRUE;
-#endif
+#endif // Win16/32
 }
 
 bool wxSetEnv(const wxString& var, const wxChar *value)
@@ -628,6 +664,8 @@ struct wxFindByPidParams
 
     // the PID we're looking from
     DWORD pid;
+
+    DECLARE_NO_COPY_CLASS(wxFindByPidParams)
 };
 
 // wxKill helper: EnumWindows() callback which is used to find the first (top
@@ -808,7 +846,7 @@ int wxKill(long pid, wxSignal sig, wxKillError *krc)
             return 0;
         }
     }
-#else // Win15
+#else // Win16
     wxFAIL_MSG( _T("not implemented") );
 #endif // Win32/Win16
 
@@ -821,7 +859,7 @@ bool wxShell(const wxString& command)
 {
     wxChar *shell = wxGetenv(wxT("COMSPEC"));
     if ( !shell )
-        shell = wxT("\\COMMAND.COM");
+        shell = (wxChar*) wxT("\\COMMAND.COM");
 
     wxString cmd;
     if ( !command )
@@ -835,7 +873,67 @@ bool wxShell(const wxString& command)
         cmd.Printf(wxT("%s /c %s"), shell, command.c_str());
     }
 
-    return wxExecute(cmd, TRUE /* sync */) != 0;
+    return wxExecute(cmd, wxEXEC_SYNC) == 0;
+}
+
+// Shutdown or reboot the PC
+bool wxShutdown(wxShutdownFlags wFlags)
+{
+#ifdef __WIN32__
+    bool bOK = TRUE;
+
+    if ( wxGetOsVersion(NULL, NULL) == wxWINDOWS_NT ) // if is NT or 2K
+    {
+        // Get a token for this process.
+        HANDLE hToken;
+        bOK = ::OpenProcessToken(GetCurrentProcess(),
+                                 TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
+                                 &hToken) != 0;
+        if ( bOK )
+        {
+            TOKEN_PRIVILEGES tkp;
+
+            // Get the LUID for the shutdown privilege.
+            ::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
+                                   &tkp.Privileges[0].Luid);
+
+            tkp.PrivilegeCount = 1;  // one privilege to set
+            tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
+
+            // Get the shutdown privilege for this process.
+            ::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
+                                    (PTOKEN_PRIVILEGES)NULL, 0);
+
+            // Cannot test the return value of AdjustTokenPrivileges.
+            bOK = ::GetLastError() == ERROR_SUCCESS;
+        }
+    }
+
+    if ( bOK )
+    {
+        UINT flags = EWX_SHUTDOWN | EWX_FORCE;
+        switch ( wFlags )
+        {
+            case wxSHUTDOWN_POWEROFF:
+                flags |= EWX_POWEROFF;
+                break;
+
+            case wxSHUTDOWN_REBOOT:
+                flags |= EWX_REBOOT;
+                break;
+
+            default:
+                wxFAIL_MSG( _T("unknown wxShutdown() flag") );
+                return FALSE;
+        }
+
+        bOK = ::ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE | EWX_REBOOT, 0) != 0;
+    }
+
+    return bOK;
+#else // Win16
+    return FALSE;
+#endif // Win32/16
 }
 
 // ----------------------------------------------------------------------------
@@ -855,6 +953,15 @@ long wxGetFreeMemory()
 #endif
 }
 
+unsigned long wxGetProcessId()
+{
+#ifdef __WIN32__
+    return ::GetCurrentProcessId();
+#else
+    return 0;
+#endif
+}
+
 // Emit a beeeeeep
 void wxBell()
 {
@@ -915,7 +1022,7 @@ int wxGetOsVersion(int *majorVsn, int *minorVsn)
 {
 #if defined(__WIN32__) && !defined(__SC__)
     static int ver = -1, major = -1, minor = -1;
-    
+
     if ( ver == -1 )
     {
         OSVERSIONINFO info;
@@ -949,7 +1056,7 @@ int wxGetOsVersion(int *majorVsn, int *minorVsn)
         *majorVsn = major;
     if (minorVsn && minor != -1)
         *minorVsn = minor;
-    
+
     return ver;
 #else // Win16
     int retValue = wxWINDOWS;
@@ -1001,6 +1108,8 @@ void wxUsleep(unsigned long milliseconds)
 #else // !Win32
     if (gs_inTimer)
         return;
+    if (miliseconds <= 0)
+        return;
 
     wxTheSleepTimer = new wxSleepTimer;
     gs_inTimer = TRUE;
@@ -1019,6 +1128,8 @@ void wxSleep(int nSecs)
 {
     if (gs_inTimer)
         return;
+    if (nSecs <= 0)
+         return;
 
     wxTheSleepTimer = new wxSleepTimer;
     gs_inTimer = TRUE;
@@ -1069,12 +1180,12 @@ void wxDebugMsg(const wxChar *fmt ...)
   static wxChar buffer[512];
 
   if (!wxTheApp->GetWantDebugOutput())
-    return ;
+    return;
 
   va_start(ap, fmt);
 
-  wvsprintf(buffer,fmt,ap) ;
-  OutputDebugString((LPCTSTR)buffer) ;
+  wvsprintf(buffer,fmt,ap);
+  OutputDebugString((LPCTSTR)buffer);
 
   va_end(ap);
 }
@@ -1562,7 +1673,7 @@ extern long wxCharsetToCodepage(const wxChar *name)
     if ( !name )
         return -1;
 
-    wxFontEncoding enc = wxTheFontMapper->CharsetToEncoding(name, FALSE);
+    wxFontEncoding enc = wxFontMapper::Get()->CharsetToEncoding(name, FALSE);
     if ( enc == wxFONTENCODING_SYSTEM )
         return -1;