X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/32c0c61cbdb919f261a88f1eb4bea9670fe93aee..198be845897a79ba350ae7f93db536ddb2eccfb2:/src/msw/utils.cpp diff --git a/src/msw/utils.cpp b/src/msw/utils.cpp index 567034d027..3e33d7fa69 100644 --- a/src/msw/utils.cpp +++ b/src/msw/utils.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: msw/utils.cpp +// Name: src/msw/utils.cpp // Purpose: Various utilities // Author: Julian Smart // Modified by: @@ -31,6 +31,7 @@ #include "wx/log.h" #endif //WX_PRECOMP +#include "wx/msw/registry.h" #include "wx/apptrait.h" #include "wx/dynlib.h" #include "wx/dynload.h" @@ -39,7 +40,7 @@ #include "wx/confbase.h" // for wxExpandEnvVars() #include "wx/msw/private.h" // includes -#include "wx/msw/missing.h" // CHARSET_HANGUL +#include "wx/msw/missing.h" // for CHARSET_HANGUL #if defined(__CYGWIN__) //CYGWIN gives annoying warning about runtime stuff if we don't do this @@ -54,8 +55,6 @@ #include #endif -#include "wx/timer.h" - #if !defined(__GNUWIN32__) && !defined(__SALFORDC__) && !defined(__WXMICROWIN__) && !defined(__WXWINCE__) #include @@ -110,8 +109,13 @@ // ---------------------------------------------------------------------------- // In the WIN.INI file +#if (!defined(USE_NET_API) && !defined(__WXWINCE__)) || defined(__WXMICROWIN__) static const wxChar WX_SECTION[] = wxT("wxWindows"); +#endif + +#if (!defined(USE_NET_API) && !defined(__WXWINCE__)) static const wxChar eUSERNAME[] = wxT("UserName"); +#endif // ============================================================================ // implementation @@ -154,7 +158,7 @@ bool wxGetHostName(wxChar *WXUNUSED_IN_WINCE(buf), // 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 @@ -262,8 +266,8 @@ bool wxGetUserId(wxChar *WXUNUSED_IN_WINCE(buf), // 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 ) + 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); @@ -278,12 +282,21 @@ bool wxGetUserId(wxChar *WXUNUSED_IN_WINCE(buf), } // Get user name e.g. Julian Smart -bool wxGetUserName(wxChar *WXUNUSED_IN_WINCE(buf), - int WXUNUSED_IN_WINCE(maxSize)) +bool wxGetUserName(wxChar *buf, int maxSize) { -#if defined(__WXWINCE__) - // TODO-CE - return false; + wxCHECK_MSG( buf && ( maxSize > 0 ), false, + _T("empty buffer in wxGetUserName") ); +#if defined(__WXWINCE__) && wxUSE_REGKEY + wxLogNull noLog; + wxRegKey key(wxRegKey::HKCU, wxT("ControlPanel\\Owner")); + if(!key.Open(wxRegKey::Read)) + return false; + wxString name; + if(!key.QueryValue(wxT("Owner"),name)) + return false; + wxStrncpy(buf, name.c_str(), maxSize-1); + buf[maxSize-1] = _T('\0'); + return true; #elif defined(USE_NET_API) CHAR szUserName[256]; if ( !wxGetUserId(szUserName, WXSIZEOF(szUserName)) ) @@ -373,7 +386,7 @@ const wxChar* wxGetHomeDir(wxString *pstr) wxString& strDir = *pstr; // first branch is for Cygwin -#if defined(__UNIX__) +#if defined(__UNIX__) && !defined(__WINE__) const wxChar *szHome = wxGetenv("HOME"); if ( szHome == NULL ) { // we're homeless... @@ -465,8 +478,8 @@ wxChar *wxGetUserHome(const wxString& WXUNUSED(user)) } bool wxGetDiskSpace(const wxString& WXUNUSED_IN_WINCE(path), - wxLongLong *WXUNUSED_IN_WINCE(pTotal), - wxLongLong *WXUNUSED_IN_WINCE(pFree)) + wxDiskspaceSize_t *WXUNUSED_IN_WINCE(pTotal), + wxDiskspaceSize_t *WXUNUSED_IN_WINCE(pFree)) { #ifdef __WXWINCE__ // TODO-CE @@ -501,7 +514,7 @@ 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) ) @@ -521,12 +534,20 @@ bool wxGetDiskSpace(const wxString& WXUNUSED_IN_WINCE(path), #endif if ( pTotal ) { - *pTotal = wxLongLong(UL(bytesTotal).HighPart, UL(bytesTotal).LowPart); +#if wxUSE_LONGLONG + *pTotal = wxDiskspaceSize_t(UL(bytesTotal).HighPart, UL(bytesTotal).LowPart); +#else + *pTotal = wxDiskspaceSize_t(UL(bytesTotal).LowPart); +#endif } if ( pFree ) { +#if wxUSE_LONGLONG *pFree = wxLongLong(UL(bytesFree).HighPart, UL(bytesFree).LowPart); +#else + *pFree = wxDiskspaceSize_t(UL(bytesFree).LowPart); +#endif } } else @@ -543,7 +564,7 @@ bool wxGetDiskSpace(const wxString& WXUNUSED_IN_WINCE(path), // 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, @@ -554,7 +575,7 @@ bool wxGetDiskSpace(const wxString& WXUNUSED_IN_WINCE(path), return false; } - wxLongLong lBytesPerCluster = lSectorsPerCluster; + wxDiskspaceSize_t lBytesPerCluster = (wxDiskspaceSize_t) lSectorsPerCluster; lBytesPerCluster *= lBytesPerSector; if ( pTotal ) @@ -587,7 +608,7 @@ bool wxGetEnv(const wxString& WXUNUSED_IN_WINCE(var), return false; #else // Win32 // first get the size of the buffer - DWORD dwRet = ::GetEnvironmentVariable(var, NULL, 0); + DWORD dwRet = ::GetEnvironmentVariable(var.wx_str(), NULL, 0); if ( !dwRet ) { // this means that there is no such variable @@ -596,7 +617,8 @@ bool wxGetEnv(const wxString& WXUNUSED_IN_WINCE(var), if ( value ) { - (void)::GetEnvironmentVariable(var, wxStringBuffer(*value, dwRet), + (void)::GetEnvironmentVariable(var.wx_str(), + wxStringBuffer(*value, dwRet), dwRet); } @@ -604,8 +626,8 @@ bool wxGetEnv(const wxString& WXUNUSED_IN_WINCE(var), #endif // WinCE/32 } -bool wxSetEnv(const wxString& WXUNUSED_IN_WINCE(var), - const wxChar *WXUNUSED_IN_WINCE(value)) +bool wxDoSetEnv(const wxString& WXUNUSED_IN_WINCE(var), + const wxChar *WXUNUSED_IN_WINCE(value)) { // some compilers have putenv() or _putenv() or _wputenv() but it's better // to always use Win32 function directly instead of dealing with them @@ -613,7 +635,7 @@ bool wxSetEnv(const wxString& WXUNUSED_IN_WINCE(var), // no environment variables under CE return false; #else - if ( !::SetEnvironmentVariable(var, value) ) + if ( !::SetEnvironmentVariable(var.wx_str(), value) ) { wxLogLastError(_T("SetEnvironmentVariable")); @@ -624,6 +646,16 @@ bool wxSetEnv(const wxString& WXUNUSED_IN_WINCE(var), #endif } +bool wxSetEnv(const wxString& variable, const wxString& value) +{ + return wxDoSetEnv(variable, value.wx_str()); +} + +bool wxUnsetEnv(const wxString& variable) +{ + return wxDoSetEnv(variable, NULL); +} + // ---------------------------------------------------------------------------- // process management // ---------------------------------------------------------------------------- @@ -929,7 +961,7 @@ bool wxShutdown(wxShutdownFlags WXUNUSED_IN_WINCE(wFlags)) #elif defined(__WIN32__) bool bOK = true; - if ( wxGetOsVersion(NULL, NULL) == wxWINDOWS_NT ) // if is NT or 2K + if ( wxGetOsVersion(NULL, NULL) == wxOS_WINDOWS_NT ) // if is NT or 2K { // Get a token for this process. HANDLE hToken; @@ -981,18 +1013,6 @@ bool wxShutdown(wxShutdownFlags WXUNUSED_IN_WINCE(wFlags)) #endif // Win32/16 } -wxPowerType wxGetPowerType() -{ - // TODO - return wxPOWER_UNKNOWN; -} - -wxBatteryState wxGetBatteryState() -{ - // TODO - return wxBATTERY_UNKNOWN_STATE; -} - // ---------------------------------------------------------------------------- // misc // ---------------------------------------------------------------------------- @@ -1059,6 +1079,13 @@ wxString wxGetOsDescription() { switch ( info.dwPlatformId ) { +#ifdef VER_PLATFORM_WIN32_CE + case VER_PLATFORM_WIN32_CE: + str.Printf(_("Windows CE (%d.%d)"), + info.dwMajorVersion, + info.dwMinorVersion); + break; +#endif case VER_PLATFORM_WIN32s: str = _("Win32s on Windows 3.1"); break; @@ -1122,7 +1149,7 @@ wxString wxGetOsDescription() break; } } - if ( wxIsEmpty(str) ) + if ( str.empty() ) { str.Printf(_("Windows NT %lu.%lu (build %lu"), info.dwMajorVersion, @@ -1145,61 +1172,59 @@ wxString wxGetOsDescription() return str; } -wxToolkitInfo& wxAppTraits::GetToolkitInfo() +bool wxIsPlatform64Bit() { - // cache the version info, it's not going to change - // - // NB: this is MT-safe, we may use these static vars from different threads - // but as they always have the same value it doesn't matter - static int s_ver = -1, - s_major = -1, - s_minor = -1; - - if ( s_ver == -1 ) +#if defined(_WIN64) + return true; // 64-bit programs run only on Win64 +#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 *); + + wxDynamicLibrary dllKernel32(_T("kernel32.dll")); + IsWow64Process_t pfnIsWow64Process = + (IsWow64Process_t)dllKernel32.RawGetSymbol(_T("IsWow64Process")); + + BOOL wow64 = FALSE; + if ( pfnIsWow64Process ) { - OSVERSIONINFO info; - wxZeroMemory(info); - - s_ver = wxWINDOWS; - info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - if ( ::GetVersionEx(&info) ) - { - s_major = info.dwMajorVersion; - s_minor = info.dwMinorVersion; + pfnIsWow64Process(::GetCurrentProcess(), &wow64); + } + //else: running under a system without Win64 support -#ifdef __SMARTPHONE__ - s_ver = wxWINDOWS_SMARTPHONE; -#elif defined(__POCKETPC__) - s_ver = wxWINDOWS_POCKETPC; + return wow64 != FALSE; #else - switch ( info.dwPlatformId ) - { - case VER_PLATFORM_WIN32s: - s_ver = wxWIN32S; - break; + return false; +#endif // Win64/Win32 +} - case VER_PLATFORM_WIN32_WINDOWS: - s_ver = wxWIN95; - break; +wxOperatingSystemId wxGetOsVersion(int *verMaj, int *verMin) +{ + OSVERSIONINFO info; + wxZeroMemory(info); - case VER_PLATFORM_WIN32_NT: - s_ver = wxWINDOWS_NT; - break; -#ifdef __WXWINCE__ - case VER_PLATFORM_WIN32_CE: - s_ver = wxWINDOWS_CE; -#endif - } -#endif - } + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + if ( ::GetVersionEx(&info) ) + { + if (verMaj) *verMaj = info.dwMajorVersion; + if (verMin) *verMin = info.dwMinorVersion; } - static wxToolkitInfo info; - info.versionMajor = s_major; - info.versionMinor = s_minor; - info.os = s_ver; - info.name = _T("wxBase"); - return info; +#if defined( __WXWINCE__ ) + return wxOS_WINDOWS_CE; +#elif defined( __WXMICROWIN__ ) + return wxOS_WINDOWS_MICRO; +#else + switch ( info.dwPlatformId ) + { + case VER_PLATFORM_WIN32_NT: + return wxOS_WINDOWS_NT; + + case VER_PLATFORM_WIN32_WINDOWS: + return wxOS_WINDOWS_9X; + } + + return wxOS_UNKNOWN; +#endif } wxWinVersion wxGetWinVersion() @@ -1208,7 +1233,7 @@ wxWinVersion wxGetWinVersion() verMin; switch ( wxGetOsVersion(&verMaj, &verMin) ) { - case wxWIN95: + case wxOS_WINDOWS_9X: if ( verMaj == 4 ) { switch ( verMin ) @@ -1225,7 +1250,7 @@ wxWinVersion wxGetWinVersion() } break; - case wxWINDOWS_NT: + case wxOS_WINDOWS_NT: switch ( verMaj ) { case 3: @@ -1253,6 +1278,9 @@ wxWinVersion wxGetWinVersion() } break; + default: + // Do nothing just to silence GCC warning + break; } return wxWinVersion_Unknown; @@ -1374,10 +1402,10 @@ extern WXDLLIMPEXP_BASE long wxEncodingToCodepage(wxFontEncoding encoding) case wxFONTENCODING_ISO8859_8: ret = 28598; break; case wxFONTENCODING_ISO8859_9: ret = 28599; break; case wxFONTENCODING_ISO8859_10: ret = 28600; break; - case wxFONTENCODING_ISO8859_11: ret = 28601; break; + case wxFONTENCODING_ISO8859_11: ret = 874; break; // case wxFONTENCODING_ISO8859_12, // doesn't exist currently, but put it case wxFONTENCODING_ISO8859_13: ret = 28603; break; - case wxFONTENCODING_ISO8859_14: ret = 28604; 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; @@ -1429,7 +1457,7 @@ extern WXDLLIMPEXP_BASE long wxEncodingToCodepage(wxFontEncoding encoding) 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 ) @@ -1448,13 +1476,14 @@ extern long wxCharsetToCodepage(const wxChar *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); @@ -1480,6 +1509,7 @@ extern long wxCharsetToCodepage(const wxChar *name) !key.QueryValue(wxT("AliasForCharset"), cn)) break; } +#endif // wxUSE_REGKEY return CP; } @@ -1544,4 +1574,3 @@ wxCreateHiddenWindow(LPCTSTR *pclassname, LPCTSTR classname, WNDPROC wndproc) return hwnd; } -