#include "wx/dynlib.h"
#include "wx/dynload.h"
#include "wx/scopeguard.h"
+#include "wx/filename.h"
#include "wx/confbase.h" // for wxExpandEnvVars()
#if defined(__WXWINCE__)
// TODO-CE
return false;
-#elif defined(__WIN32__) && !defined(__WXMICROWIN__)
+#else
DWORD nSize = maxSize;
if ( !::GetComputerName(buf, &nSize) )
{
}
return true;
-#else
- wxChar *sysname;
- const wxChar *default_host = wxT("noname");
-
- if ((sysname = wxGetenv(wxT("SYSTEM_NAME"))) == NULL) {
- GetProfileString(WX_SECTION, eHOSTNAME, default_host, buf, maxSize - 1);
- } else
- wxStrncpy(buf, sysname, maxSize - 1);
- buf[maxSize] = wxT('\0');
- return *buf ? true : false;
#endif
}
if ( !host.empty() )
{
- wxStrncpy(buf, host, maxSize);
+ wxStrlcpy(buf, host.c_str(), maxSize);
return true;
}
#if defined(__WXWINCE__)
// TODO-CE
return false;
-#elif defined(__WIN32__) && !defined(__WXMICROWIN__)
+#else
DWORD nSize = maxSize;
if ( ::GetUserName(buf, &nSize) == 0 )
{
}
return true;
-#else // __WXMICROWIN__
- wxChar *user;
- const wxChar *default_id = wxT("anonymous");
-
- // Can't assume we have NIS (PC-NFS) or some other ID daemon
- // So we ...
- if ( (user = wxGetenv(wxT("USER"))) == NULL &&
- (user = wxGetenv(wxT("LOGNAME"))) == NULL )
- {
- // Use wxWidgets configuration data (comming soon)
- GetProfileString(WX_SECTION, eUSERID, default_id, buf, maxSize - 1);
- }
- else
- {
- wxStrncpy(buf, user, maxSize - 1);
- }
-
- return *buf ? true : false;
#endif
}
wxString name;
if(!key.QueryValue(wxT("Owner"),name))
return false;
- wxStrncpy(buf, name.c_str(), maxSize-1);
- buf[maxSize-1] = _T('\0');
+ wxStrlcpy(buf, name.c_str(), maxSize);
return true;
#elif defined(USE_NET_API)
CHAR szUserName[256];
if ( !ok )
{
- wxStrncpy(buf, wxT("Unknown User"), maxSize);
+ wxStrlcpy(buf, wxT("Unknown User"), maxSize);
}
return true;
else // fall back to the program directory
{
// extract the directory component of the program file name
- wxSplitPath(wxGetFullModuleName(), &strDir, NULL, NULL);
+ wxFileName::SplitPath(wxGetFullModuleName(), &strDir, NULL, NULL);
}
#endif // UNIX/Win
return false;
#else // Win32
// first get the size of the buffer
- DWORD dwRet = ::GetEnvironmentVariable(var.wx_str(), NULL, 0);
+ DWORD dwRet = ::GetEnvironmentVariable(var.t_str(), NULL, 0);
if ( !dwRet )
{
// this means that there is no such variable
if ( value )
{
- (void)::GetEnvironmentVariable(var.wx_str(),
+ (void)::GetEnvironmentVariable(var.t_str(),
wxStringBuffer(*value, dwRet),
dwRet);
}
// no environment variables under CE
return false;
#else
- if ( !::SetEnvironmentVariable(var.wx_str(), value) )
+ if ( !::SetEnvironmentVariable(var.t_str(), value) )
{
wxLogLastError(_T("SetEnvironmentVariable"));
bool wxSetEnv(const wxString& variable, const wxString& value)
{
- return wxDoSetEnv(variable, value.wx_str());
+ return wxDoSetEnv(variable, value.t_str());
}
bool wxUnsetEnv(const wxString& variable)
}
// Shutdown or reboot the PC
-bool wxShutdown(wxShutdownFlags WXUNUSED_IN_WINCE(wFlags))
+bool wxShutdown(int WXUNUSED_IN_WINCE(flags))
{
#ifdef __WXWINCE__
// TODO-CE
TOKEN_PRIVILEGES tkp;
// Get the LUID for the shutdown privilege.
- ::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
- &tkp.Privileges[0].Luid);
+ bOK = ::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
+ &tkp.Privileges[0].Luid) != 0;
+
+ if ( bOK )
+ {
+ tkp.PrivilegeCount = 1; // one privilege to set
+ tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
- 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);
- // 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;
+ }
- // Cannot test the return value of AdjustTokenPrivileges.
- bOK = ::GetLastError() == ERROR_SUCCESS;
+ ::CloseHandle(hToken);
}
}
if ( bOK )
{
- UINT flags = EWX_SHUTDOWN | EWX_FORCE;
- switch ( wFlags )
+ UINT wFlags = 0;
+ if ( flags & wxSHUTDOWN_FORCE )
+ {
+ wFlags = EWX_FORCE;
+ flags &= ~wxSHUTDOWN_FORCE;
+ }
+
+ switch ( flags )
{
case wxSHUTDOWN_POWEROFF:
- flags |= EWX_POWEROFF;
+ wFlags |= EWX_POWEROFF;
break;
case wxSHUTDOWN_REBOOT:
- flags |= EWX_REBOOT;
+ wFlags |= EWX_REBOOT;
+ break;
+
+ case wxSHUTDOWN_LOGOFF:
+ wFlags |= EWX_LOGOFF;
break;
default:
return false;
}
- bOK = ::ExitWindowsEx(flags, 0) != 0;
+ bOK = ::ExitWindowsEx(wFlags, 0) != 0;
}
return bOK;
-#endif // Win32/16
+#endif // WinCE/!WinCE
}
// ----------------------------------------------------------------------------
// OS version
// ----------------------------------------------------------------------------
+// check if we're running under a server or workstation Windows system: it
+// returns true or false with obvious meaning as well as -1 if the system type
+// couldn't be determined
+//
+// this function is currently private but we may want to expose it later if
+// it's really useful
+namespace
+{
+
+int wxIsWindowsServer()
+{
+#ifdef VER_NT_WORKSTATION
+ OSVERSIONINFOEX info;
+ wxZeroMemory(info);
+
+ info.dwOSVersionInfoSize = sizeof(info);
+ if ( ::GetVersionEx(reinterpret_cast<OSVERSIONINFO *>(&info)) )
+ {
+ switch ( info.wProductType )
+ {
+ case VER_NT_WORKSTATION:
+ return false;
+
+ case VER_NT_SERVER:
+ case VER_NT_DOMAIN_CONTROLLER:
+ return true;
+ }
+ }
+#endif // VER_NT_WORKSTATION
+
+ return -1;
+}
+
+} // anonymous namespace
+
wxString wxGetOsDescription()
{
wxString str;
break;
case VER_PLATFORM_WIN32_NT:
- if ( info.dwMajorVersion == 5 )
+ switch ( info.dwMajorVersion )
{
- switch ( info.dwMinorVersion )
- {
- case 0:
- str.Printf(_("Windows 2000 (build %lu"),
- info.dwBuildNumber);
- break;
- case 1:
- str.Printf(_("Windows XP (build %lu"),
- info.dwBuildNumber);
- break;
- case 2:
- str.Printf(_("Windows Server 2003 (build %lu"),
+ case 5:
+ switch ( info.dwMinorVersion )
+ {
+ case 0:
+ str.Printf(_("Windows 2000 (build %lu"),
+ info.dwBuildNumber);
+ break;
+
+ case 2:
+ // we can't distinguish between XP 64 and 2003
+ // as they both are 5.2, so examine the product
+ // type to resolve this ambiguity
+ if ( wxIsWindowsServer() == 1 )
+ {
+ str.Printf(_("Windows Server 2003 (build %lu"),
+ info.dwBuildNumber);
+ break;
+ }
+ //else: must be XP, fall through
+
+ case 1:
+ str.Printf(_("Windows XP (build %lu"),
+ info.dwBuildNumber);
+ break;
+ }
+ break;
+
+ case 6:
+ if ( info.dwMinorVersion == 0 )
+ {
+ str.Printf(_("Windows Vista (build %lu"),
info.dwBuildNumber);
- break;
- }
+ }
+ break;
}
+
if ( str.empty() )
{
str.Printf(_("Windows NT %lu.%lu (build %lu"),
info.dwMinorVersion,
info.dwBuildNumber);
}
+
if ( !wxIsEmpty(info.szCSDVersion) )
{
str << _T(", ") << info.szCSDVersion;
}
str << _T(')');
+
+ if ( wxIsPlatform64Bit() )
+ str << _(", 64-bit edition");
break;
}
}