#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(__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 )
{
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 )
WSACleanup();
- if ( !!host )
+ if ( !host.empty() )
{
wxStrncpy(buf, host, maxSize);
return TRUE;
}
}
+#endif // wxUSE_SOCKETS
+
#endif // Win32
return wxGetHostName(buf, maxSize);
#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
return 0;
}
}
-#else // Win15
+#else // Win16
wxFAIL_MSG( _T("not implemented") );
#endif // Win32/Win16
{
wxChar *shell = wxGetenv(wxT("COMSPEC"));
if ( !shell )
- shell = wxT("\\COMMAND.COM");
+ shell = (wxChar*) wxT("\\COMMAND.COM");
wxString cmd;
if ( !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
// ----------------------------------------------------------------------------
#endif
}
+unsigned long wxGetProcessId()
+{
+#ifdef __WIN32__
+ return ::GetCurrentProcessId();
+#else
+ return 0;
+#endif
+}
+
// Emit a beeeeeep
void wxBell()
{
int wxGetOsVersion(int *majorVsn, int *minorVsn)
{
#if defined(__WIN32__) && !defined(__SC__)
- OSVERSIONINFO info;
- wxZeroMemory(info);
+ static int ver = -1, major = -1, minor = -1;
- info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
- if ( ::GetVersionEx(&info) )
+ if ( ver == -1 )
{
- if (majorVsn)
- *majorVsn = info.dwMajorVersion;
- if (minorVsn)
- *minorVsn = info.dwMinorVersion;
+ OSVERSIONINFO info;
+ wxZeroMemory(info);
- switch ( info.dwPlatformId )
+ ver = wxWINDOWS;
+ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ if ( ::GetVersionEx(&info) )
{
- case VER_PLATFORM_WIN32s:
- return wxWIN32S;
+ major = info.dwMajorVersion;
+ minor = info.dwMinorVersion;
- case VER_PLATFORM_WIN32_WINDOWS:
- return wxWIN95;
+ switch ( info.dwPlatformId )
+ {
+ case VER_PLATFORM_WIN32s:
+ ver = wxWIN32S;
+ break;
- case VER_PLATFORM_WIN32_NT:
- return wxWINDOWS_NT;
+ case VER_PLATFORM_WIN32_WINDOWS:
+ ver = wxWIN95;
+ break;
+
+ case VER_PLATFORM_WIN32_NT:
+ ver = wxWINDOWS_NT;
+ break;
+ }
}
}
- return wxWINDOWS; // error if we get here, return generic value
+ if (majorVsn && major != -1)
+ *majorVsn = major;
+ if (minorVsn && minor != -1)
+ *minorVsn = minor;
+
+ return ver;
#else // Win16
int retValue = wxWINDOWS;
#ifdef __WINDOWS_386__
// 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__
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);
}
}
#endif // __WXMICROWIN__
+#endif // WXWIN_COMPATIBILITY_2_2
+
+#if wxUSE_GUI
+
// ----------------------------------------------------------------------------
// functions to work with .INI files
// ----------------------------------------------------------------------------
#endif // Win16/32
}
-#endif // wxUSE_GUI
-
-#if wxUSE_GUI
-
// ----------------------------------------------------------------------------
// Metafile helpers
// ----------------------------------------------------------------------------
if ( !name )
return -1;
- wxFontEncoding enc = wxTheFontMapper->CharsetToEncoding(name, FALSE);
+ wxFontEncoding enc = wxFontMapper::Get()->CharsetToEncoding(name, FALSE);
if ( enc == wxFONTENCODING_SYSTEM )
return -1;