X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7bea7b91482dd41568e11fc9e91ce485db680ddd..c348a710f06d6168c64434b776df94e532d7eea7:/src/msw/utils.cpp diff --git a/src/msw/utils.cpp b/src/msw/utils.cpp index ead9e70d1c..6eff2fe253 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: @@ -25,12 +25,15 @@ #endif #ifndef WX_PRECOMP + #include "wx/msw/missing.h" // CHARSET_HANGUL #include "wx/utils.h" #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/apptrait.h" #include "wx/dynlib.h" #include "wx/dynload.h" @@ -39,7 +42,6 @@ #include "wx/confbase.h" // for wxExpandEnvVars() #include "wx/msw/private.h" // includes -#include "wx/msw/missing.h" // CHARSET_HANGUL #if defined(__CYGWIN__) //CYGWIN gives annoying warning about runtime stuff if we don't do this @@ -54,8 +56,6 @@ #include #endif -#include "wx/timer.h" - #if !defined(__GNUWIN32__) && !defined(__SALFORDC__) && !defined(__WXMICROWIN__) && !defined(__WXWINCE__) #include @@ -110,8 +110,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 @@ -262,8 +267,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 +283,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) { + wxCHECK_MSG( buf && ( maxSize > 0 ), false, + _T("empty buffer in wxGetUserName") ); #if defined(__WXWINCE__) - // TODO-CE - return false; + 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)) ) @@ -465,8 +479,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 @@ -521,12 +535,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 @@ -554,7 +576,7 @@ bool wxGetDiskSpace(const wxString& WXUNUSED_IN_WINCE(path), return false; } - wxLongLong lBytesPerCluster = lSectorsPerCluster; + wxDiskspaceSize_t lBytesPerCluster = (wxDiskspaceSize_t) lSectorsPerCluster; lBytesPerCluster *= lBytesPerSector; if ( pTotal ) @@ -806,9 +828,11 @@ int wxKill(long pid, wxSignal sig, wxKillError *krc, int flags) return 0; } -HANDLE (WINAPI *lpfCreateToolhelp32Snapshot)(DWORD,DWORD) ; -BOOL (WINAPI *lpfProcess32First)(HANDLE,LPPROCESSENTRY32) ; -BOOL (WINAPI *lpfProcess32Next)(HANDLE,LPPROCESSENTRY32) ; +typedef HANDLE (WINAPI *CreateToolhelp32Snapshot_t)(DWORD,DWORD); +typedef BOOL (WINAPI *Process32_t)(HANDLE,LPPROCESSENTRY32); + +CreateToolhelp32Snapshot_t lpfCreateToolhelp32Snapshot; +Process32_t lpfProcess32First, lpfProcess32Next; static void InitToolHelp32() { @@ -823,9 +847,9 @@ static void InitToolHelp32() lpfProcess32First = NULL; lpfProcess32Next = NULL; - HINSTANCE hInstLib = LoadLibrary( wxT("Kernel32.DLL") ) ; - if( hInstLib == NULL ) - return ; +#if wxUSE_DYNLIB_CLASS + + wxDynamicLibrary dllKernel(_T("kernel32.dll"), wxDL_VERBATIM); // Get procedure addresses. // We are linking to these functions of Kernel32 @@ -833,37 +857,16 @@ static void InitToolHelp32() // this code would fail to load under Windows NT, // which does not have the Toolhelp32 // functions in the Kernel 32. - lpfCreateToolhelp32Snapshot= - (HANDLE(WINAPI *)(DWORD,DWORD)) - GetProcAddress( hInstLib, -#ifdef __WXWINCE__ - wxT("CreateToolhelp32Snapshot") -#else - "CreateToolhelp32Snapshot" -#endif - ) ; + lpfCreateToolhelp32Snapshot = + (CreateToolhelp32Snapshot_t)dllKernel.RawGetSymbol(_T("CreateToolhelp32Snapshot")); - lpfProcess32First= - (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32)) - GetProcAddress( hInstLib, -#ifdef __WXWINCE__ - wxT("Process32First") -#else - "Process32First" -#endif - ) ; + lpfProcess32First = + (Process32_t)dllKernel.RawGetSymbol(_T("Process32First")); - lpfProcess32Next= - (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32)) - GetProcAddress( hInstLib, -#ifdef __WXWINCE__ - wxT("Process32Next") -#else - "Process32Next" -#endif - ) ; + lpfProcess32Next = + (Process32_t)dllKernel.RawGetSymbol(_T("Process32Next")); - FreeLibrary( hInstLib ) ; +#endif // wxUSE_DYNLIB_CLASS } // By John Skiff @@ -948,7 +951,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; @@ -1000,18 +1003,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 // ---------------------------------------------------------------------------- @@ -1078,6 +1069,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; @@ -1141,7 +1139,7 @@ wxString wxGetOsDescription() break; } } - if ( wxIsEmpty(str) ) + if ( str.empty() ) { str.Printf(_("Windows NT %lu.%lu (build %lu"), info.dwMajorVersion, @@ -1164,61 +1162,57 @@ 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 +#else // 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); + pfnIsWow64Process(::GetCurrentProcess(), &wow64); + } + //else: running under a system without Win64 support - s_ver = wxWINDOWS; - info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - if ( ::GetVersionEx(&info) ) - { - s_major = info.dwMajorVersion; - s_minor = info.dwMinorVersion; + return wow64 != FALSE; +#endif // Win64/Win32 +} -#ifdef __SMARTPHONE__ - s_ver = wxWINDOWS_SMARTPHONE; -#elif defined(__POCKETPC__) - s_ver = wxWINDOWS_POCKETPC; -#else - switch ( info.dwPlatformId ) - { - case VER_PLATFORM_WIN32s: - s_ver = wxWIN32S; - break; +wxOperatingSystemId wxGetOsVersion(int *verMaj, int *verMin) +{ + OSVERSIONINFO info; + wxZeroMemory(info); - case VER_PLATFORM_WIN32_WINDOWS: - s_ver = wxWIN95; - break; + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + if ( ::GetVersionEx(&info) ) + { + if (verMaj) *verMaj = info.dwMajorVersion; + if (verMin) *verMin = info.dwMinorVersion; + } - case VER_PLATFORM_WIN32_NT: - s_ver = wxWINDOWS_NT; - break; -#ifdef __WXWINCE__ - case VER_PLATFORM_WIN32_CE: - s_ver = wxWINDOWS_CE; -#endif - } -#endif - } +#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; } - static wxToolkitInfo info; - info.versionMajor = s_major; - info.versionMinor = s_minor; - info.os = s_ver; - info.name = _T("wxBase"); - return info; + return wxOS_UNKNOWN; +#endif } wxWinVersion wxGetWinVersion() @@ -1227,7 +1221,7 @@ wxWinVersion wxGetWinVersion() verMin; switch ( wxGetOsVersion(&verMaj, &verMin) ) { - case wxWIN95: + case wxOS_WINDOWS_9X: if ( verMaj == 4 ) { switch ( verMin ) @@ -1244,7 +1238,7 @@ wxWinVersion wxGetWinVersion() } break; - case wxWINDOWS_NT: + case wxOS_WINDOWS_NT: switch ( verMaj ) { case 3: @@ -1272,6 +1266,9 @@ wxWinVersion wxGetWinVersion() } break; + default: + // Do nothing just to silence GCC warning + break; } return wxWinVersion_Unknown; @@ -1393,10 +1390,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; @@ -1563,4 +1560,3 @@ wxCreateHiddenWindow(LPCTSTR *pclassname, LPCTSTR classname, WNDPROC wndproc) return hwnd; } -