X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6af638ed35e8f1c414cc209cda8e5059552883c8..2b4f3c9f768c91d1927c263f5db644cc16fca0b9:/src/msw/utils.cpp diff --git a/src/msw/utils.cpp b/src/msw/utils.cpp index e66b56d51d..707c1d4664 100644 --- a/src/msw/utils.cpp +++ b/src/msw/utils.cpp @@ -178,6 +178,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 ) { @@ -206,13 +211,15 @@ bool wxGetFullHostName(wxChar *buf, int maxSize) WSACleanup(); - if ( !!host ) + if ( !host.empty() ) { wxStrncpy(buf, host, maxSize); return TRUE; } } +#endif // wxUSE_SOCKETS + #endif // Win32 return wxGetHostName(buf, maxSize); @@ -382,25 +389,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 @@ -808,7 +845,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 +858,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 ) @@ -838,6 +875,66 @@ bool wxShell(const wxString& command) return wxExecute(cmd, TRUE /* 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 +} + // ---------------------------------------------------------------------------- // misc // ---------------------------------------------------------------------------- @@ -915,7 +1012,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 +1046,7 @@ int wxGetOsVersion(int *majorVsn, int *minorVsn) *majorVsn = major; if (minorVsn && minor != -1) *minorVsn = minor; - + return ver; #else // Win16 int retValue = wxWINDOWS; @@ -1059,7 +1156,7 @@ void wxSleep(int nSecs) // deprecated (in favour of wxLog) log functions // ---------------------------------------------------------------------------- -#if wxUSE_GUI +#if WXWIN_COMPATIBILITY_2_2 // Output a debug mess., in a system dependent fashion. #ifndef __WXMICROWIN__ @@ -1069,12 +1166,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); } @@ -1096,6 +1193,10 @@ void wxFatalError(const wxString& msg, const wxString& title) } #endif // __WXMICROWIN__ +#endif // WXWIN_COMPATIBILITY_2_2 + +#if wxUSE_GUI + // ---------------------------------------------------------------------------- // functions to work with .INI files // ---------------------------------------------------------------------------- @@ -1468,10 +1569,6 @@ WXWORD WXDLLEXPORT wxGetWindowId(WXHWND hWnd) #endif // Win16/32 } -#endif // wxUSE_GUI - -#if wxUSE_GUI - // ---------------------------------------------------------------------------- // Metafile helpers // ---------------------------------------------------------------------------- @@ -1562,7 +1659,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;