#include "wx/app.h"
#include "wx/intl.h"
#include "wx/log.h"
- #include "wx/timer.h"
#endif //WX_PRECOMP
#include "wx/msw/registry.h"
#include "wx/dynlib.h"
#include "wx/dynload.h"
#include "wx/scopeguard.h"
+#include "wx/filename.h"
#include "wx/confbase.h" // for wxExpandEnvVars()
#include <winsock.h>
#endif
-#if !defined(__GNUWIN32__) && !defined(__SALFORDC__) && !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
+#if !defined(__GNUWIN32__) && !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
#include <direct.h>
#ifndef __MWERKS__
#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
}
// get full hostname (with domain name if possible)
bool wxGetFullHostName(wxChar *buf, int maxSize)
{
-#if !defined( __WXMICROWIN__) && wxUSE_DYNAMIC_LOADER && wxUSE_SOCKETS
+#if !defined( __WXMICROWIN__) && wxUSE_DYNLIB_CLASS && wxUSE_SOCKETS
// TODO should use GetComputerNameEx() when available
// we don't want to always link with Winsock DLL as we might not use it at
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
}
{
wxCHECK_MSG( buf && ( maxSize > 0 ), false,
_T("empty buffer in wxGetUserName") );
-#if defined(__WXWINCE__)
+#if defined(__WXWINCE__) && wxUSE_REGKEY
wxLogNull noLog;
wxRegKey key(wxRegKey::HKCU, wxT("ControlPanel\\Owner"));
if(!key.Open(wxRegKey::Read))
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 strDir.c_str();
}
-wxChar *wxGetUserHome(const wxString& WXUNUSED(user))
+wxString wxGetUserHome(const wxString& user)
{
- // VZ: the old code here never worked for user != "" anyhow! Moreover, it
- // returned sometimes a malloc()'d pointer, sometimes a pointer to a
- // static buffer and sometimes I don't even know what.
- static wxString s_home;
+ wxString home;
+
+ if ( user.empty() || user == wxGetUserId() )
+ wxGetHomeDir(&home);
- return (wxChar *)wxGetHomeDir(&s_home);
+ return home;
}
bool wxGetDiskSpace(const wxString& WXUNUSED_IN_WINCE(path),
ULARGE_INTEGER bytesFree, bytesTotal;
// may pass the path as is, GetDiskFreeSpaceEx() is smart enough
- if ( !pGetDiskFreeSpaceEx(path,
+ if ( !pGetDiskFreeSpaceEx(path.fn_str(),
&bytesFree,
&bytesTotal,
NULL) )
// FIXME: this is wrong, we should extract the root drive from path
// instead, but this is the job for wxFileName...
- if ( !::GetDiskFreeSpace(path,
+ if ( !::GetDiskFreeSpace(path.fn_str(),
&lSectorsPerCluster,
&lBytesPerSector,
&lNumberOfFreeClusters,
return false;
#else // Win32
// first get the size of the buffer
- DWORD dwRet = ::GetEnvironmentVariable(var, 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, wxStringBuffer(*value, dwRet),
+ (void)::GetEnvironmentVariable(var.t_str(),
+ wxStringBuffer(*value, dwRet),
dwRet);
}
#endif // WinCE/32
}
-bool wxSetEnv(const wxString& WXUNUSED_IN_WINCE(var),
- const wxChar *WXUNUSED_IN_WINCE(value))
+bool wxDoSetEnv(const wxString& var, const wxChar *value)
{
- // some compilers have putenv() or _putenv() or _wputenv() but it's better
- // to always use Win32 function directly instead of dealing with them
#ifdef __WXWINCE__
// no environment variables under CE
+ wxUnusedVar(var);
+ wxUnusedVar(value);
return false;
-#else
- if ( !::SetEnvironmentVariable(var, value) )
+#else // !__WXWINCE__
+ // update the CRT environment if possible as people expect getenv() to also
+ // work and it is not affected by Win32 SetEnvironmentVariable() call (OTOH
+ // the CRT does use Win32 call to update the process environment block so
+ // there is no need to call it)
+ //
+ // TODO: add checks for the other compilers (and update wxSetEnv()
+ // documentation in interface/wx/utils.h accordingly)
+#if defined(__VISUALC__)
+ // notice that Microsoft _putenv() has different semantics from POSIX
+ // function with almost the same name: in particular it makes a copy of the
+ // string instead of using it as part of environment so we can safely call
+ // it here without going through all the troubles with wxSetEnvModule as in
+ // src/unix/utilsunx.cpp
+ wxString envstr = var;
+ envstr += '=';
+ if ( value )
+ envstr += value;
+ _tputenv(envstr.t_str());
+#else // other compiler
+ if ( !::SetEnvironmentVariable(var.t_str(), value) )
{
wxLogLastError(_T("SetEnvironmentVariable"));
return false;
}
+#endif // compiler
return true;
-#endif
+#endif // __WXWINCE__/!__WXWINCE__
+}
+
+bool wxSetEnv(const wxString& variable, const wxString& value)
+{
+ return wxDoSetEnv(variable, value.t_str());
+}
+
+bool wxUnsetEnv(const wxString& variable)
+{
+ return wxDoSetEnv(variable, NULL);
}
// ----------------------------------------------------------------------------
// the PID we're looking from
DWORD pid;
- DECLARE_NO_COPY_CLASS(wxFindByPidParams)
+ wxDECLARE_NO_COPY_CLASS(wxFindByPidParams);
};
// wxKill helper: EnumWindows() callback which is used to find the first (top
}
// 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;
}
}
{
#if defined(_WIN64)
return true; // 64-bit programs run only on Win64
-#else // Win32
+#elif wxUSE_DYNLIB_CLASS // Win32
// 32-bit programs run on both 32-bit and 64-bit Windows so check
typedef BOOL (WINAPI *IsWow64Process_t)(HANDLE, BOOL *);
//else: running under a system without Win64 support
return wow64 != FALSE;
+#else
+ return false;
#endif // Win64/Win32
}
wxOperatingSystemId wxGetOsVersion(int *verMaj, int *verMin)
{
- OSVERSIONINFO info;
- wxZeroMemory(info);
+ static struct
+ {
+ // this may be false, true or -1 if we tried to initialize but failed
+ int initialized;
- info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
- if ( ::GetVersionEx(&info) )
+ wxOperatingSystemId os;
+
+ int verMaj,
+ verMin;
+ } s_version;
+
+ // query the OS info only once as it's not supposed to change
+ if ( !s_version.initialized )
{
- if (verMaj) *verMaj = info.dwMajorVersion;
- if (verMin) *verMin = info.dwMinorVersion;
+ OSVERSIONINFO info;
+ wxZeroMemory(info);
+ info.dwOSVersionInfoSize = sizeof(info);
+ if ( ::GetVersionEx(&info) )
+ {
+ s_version.initialized = true;
+
+#if defined(__WXWINCE__)
+ s_version.os = wxOS_WINDOWS_CE;
+#elif defined(__WXMICROWIN__)
+ s_version.os = wxOS_WINDOWS_MICRO;
+#else // "normal" desktop Windows system, use run-time detection
+ switch ( info.dwPlatformId )
+ {
+ case VER_PLATFORM_WIN32_NT:
+ s_version.os = wxOS_WINDOWS_NT;
+ break;
+
+ case VER_PLATFORM_WIN32_WINDOWS:
+ s_version.os = wxOS_WINDOWS_9X;
+ break;
+ }
+#endif // Windows versions
+
+ s_version.verMaj = info.dwMajorVersion;
+ s_version.verMin = info.dwMinorVersion;
+ }
+ else // GetVersionEx() failed
+ {
+ s_version.initialized = -1;
+ }
}
-#if defined( __WXWINCE__ )
- return wxOS_WINDOWS_CE;
-#elif defined( __WXMICROWIN__ )
- return wxOS_WINDOWS_MICRO;
-#else
- switch ( info.dwPlatformId )
+ if ( s_version.initialized == 1 )
{
- case VER_PLATFORM_WIN32_NT:
- return wxOS_WINDOWS_NT;
-
- case VER_PLATFORM_WIN32_WINDOWS:
- return wxOS_WINDOWS_9X;
+ if ( verMaj )
+ *verMaj = s_version.verMaj;
+ if ( verMin )
+ *verMin = s_version.verMin;
}
- return wxOS_UNKNOWN;
-#endif
+ // this works even if we were not initialized successfully as the initial
+ // values of this field is 0 which is wxOS_UNKNOWN and exactly what we need
+ return s_version.os;
}
wxWinVersion wxGetWinVersion()
case wxFONTENCODING_ISO8859_13: ret = 28603; break;
// case wxFONTENCODING_ISO8859_14: ret = 28604; break; // no correspondence on Windows
case wxFONTENCODING_ISO8859_15: ret = 28605; break;
+
case wxFONTENCODING_KOI8: ret = 20866; break;
case wxFONTENCODING_KOI8_U: ret = 21866; break;
+
case wxFONTENCODING_CP437: ret = 437; break;
case wxFONTENCODING_CP850: ret = 850; break;
case wxFONTENCODING_CP852: ret = 852; break;
case wxFONTENCODING_CP1255: ret = 1255; break;
case wxFONTENCODING_CP1256: ret = 1256; break;
case wxFONTENCODING_CP1257: ret = 1257; break;
+
case wxFONTENCODING_EUC_JP: ret = 20932; break;
+
case wxFONTENCODING_MACROMAN: ret = 10000; break;
case wxFONTENCODING_MACJAPANESE: ret = 10001; break;
case wxFONTENCODING_MACCHINESETRAD: ret = 10002; break;
case wxFONTENCODING_MACCROATIAN: ret = 10082; break;
case wxFONTENCODING_MACICELANDIC: ret = 10079; break;
case wxFONTENCODING_MACROMANIAN: ret = 10009; break;
+
+ case wxFONTENCODING_ISO2022_JP: ret = 50222; break;
+
case wxFONTENCODING_UTF7: ret = 65000; break;
case wxFONTENCODING_UTF8: ret = 65001; break;
+
default: return -1;
}
return (long) ret;
}
-extern long wxCharsetToCodepage(const wxChar *name)
+extern long wxCharsetToCodepage(const char *name)
{
// first get the font encoding for this charset
if ( !name )
#include "wx/msw/registry.h"
// this should work if Internet Exploiter is installed
-extern long wxCharsetToCodepage(const wxChar *name)
+extern long wxCharsetToCodepage(const char *name)
{
if (!name)
return GetACP();
long CP = -1;
+#if wxUSE_REGKEY
wxString path(wxT("MIME\\Database\\Charset\\"));
wxString cn(name);
!key.QueryValue(wxT("AliasForCharset"), cn))
break;
}
+#endif // wxUSE_REGKEY
return CP;
}