X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b4367c87f12ee10a9d62a9095c38bab19d36d3fa..21bd196564d8483879a57c40ec1eea64114f9bd4:/src/msw/utils.cpp diff --git a/src/msw/utils.cpp b/src/msw/utils.cpp index 901aa039ed..ef6d79c150 100644 --- a/src/msw/utils.cpp +++ b/src/msw/utils.cpp @@ -32,6 +32,7 @@ #endif //WX_PRECOMP #include "wx/apptrait.h" +#include "wx/dynlib.h" #include "wx/dynload.h" #include "wx/confbase.h" // for wxExpandEnvVars() @@ -39,8 +40,8 @@ #include "wx/msw/private.h" // includes #include "wx/msw/missing.h" // CHARSET_HANGUL -#if defined(__GNUWIN32_OLD__) || defined(__WXWINCE__) \ - || defined(__CYGWIN32__) +// Doesn't work with Cygwin at present +#if wxUSE_SOCKETS && (defined(__GNUWIN32_OLD__) || defined(__WXWINCE__) || defined(__CYGWIN32__)) // apparently we need to include winsock.h to get WSADATA and other stuff // used in wxGetFullHostName() with the old mingw32 versions #include @@ -117,6 +118,9 @@ static const wxChar eUSERNAME[] = wxT("UserName"); bool wxGetHostName(wxChar *buf, int maxSize) { #if defined(__WXWINCE__) + // TODO-CE + wxUnusedVar(buf); + wxUnusedVar(maxSize); return false; #elif defined(__WIN32__) && !defined(__WXMICROWIN__) DWORD nSize = maxSize; @@ -144,7 +148,7 @@ bool wxGetHostName(wxChar *buf, int maxSize) // get full hostname (with domain name if possible) bool wxGetFullHostName(wxChar *buf, int maxSize) { -#if !defined( __WXMICROWIN__) && wxUSE_DYNAMIC_LOADER +#if !defined( __WXMICROWIN__) && wxUSE_DYNAMIC_LOADER && 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 @@ -229,6 +233,9 @@ bool wxGetFullHostName(wxChar *buf, int maxSize) bool wxGetUserId(wxChar *buf, int maxSize) { #if defined(__WXWINCE__) + // TODO-CE + wxUnusedVar(buf); + wxUnusedVar(maxSize); return false; #elif defined(__WIN32__) && !defined(__WXMICROWIN__) DWORD nSize = maxSize; @@ -269,6 +276,9 @@ bool wxGetUserId(wxChar *buf, int maxSize) bool wxGetUserName(wxChar *buf, int maxSize) { #if defined(__WXWINCE__) + // TODO-CE + wxUnusedVar(buf); + wxUnusedVar(maxSize); return false; #elif defined(USE_NET_API) CHAR szUserName[256]; @@ -349,9 +359,9 @@ error: { wxStrncpy(buf, wxT("Unknown User"), maxSize); } -#endif // Win32/16 return true; +#endif // Win32/16 } const wxChar* wxGetHomeDir(wxString *pstr) @@ -380,7 +390,7 @@ const wxChar* wxGetHomeDir(wxString *pstr) strDir = windowsPath; #endif #elif defined(__WXWINCE__) - // Nothing + strDir = wxT("\\"); #else strDir.clear(); @@ -450,19 +460,13 @@ wxChar *wxGetUserHome(const wxString& WXUNUSED(user)) return (wxChar *)wxGetHomeDir(&s_home); } -bool wxDirExists(const wxString& dir) -{ -#ifdef __WXMICROWIN__ - return wxPathExist(dir); -#elif defined(__WIN32__) - DWORD attribs = GetFileAttributes(dir); - return ((attribs != (DWORD)-1) && (attribs & FILE_ATTRIBUTE_DIRECTORY)); -#endif // Win32/__WXMICROWIN__ -} - bool wxGetDiskSpace(const wxString& path, wxLongLong *pTotal, wxLongLong *pFree) { #ifdef __WXWINCE__ + // TODO-CE + wxUnusedVar(path); + wxUnusedVar(pTotal); + wxUnusedVar(pFree); return false; #else if ( path.empty() ) @@ -575,6 +579,9 @@ bool wxGetDiskSpace(const wxString& path, wxLongLong *pTotal, wxLongLong *pFree) bool wxGetEnv(const wxString& var, wxString *value) { #ifdef __WXWINCE__ + // no environment variables under CE + wxUnusedVar(var); + wxUnusedVar(value); return false; #else // Win32 // first get the size of the buffer @@ -609,6 +616,9 @@ bool wxSetEnv(const wxString& var, const wxChar *value) return true; #else // no way to set env vars + // no environment variables under CE + wxUnusedVar(var); + wxUnusedVar(value); return false; #endif } @@ -658,7 +668,7 @@ int wxKill(long pid, wxSignal sig, wxKillError *krc, int flags) { if (flags & wxKILL_CHILDREN) wxKillAllChildren(pid, sig, krc); - + // get the process handle to operate on HANDLE hProcess = ::OpenProcess(SYNCHRONIZE | PROCESS_TERMINATE | @@ -816,24 +826,24 @@ int wxKill(long pid, wxSignal sig, wxKillError *krc, int flags) HANDLE (WINAPI *lpfCreateToolhelp32Snapshot)(DWORD,DWORD) ; BOOL (WINAPI *lpfProcess32First)(HANDLE,LPPROCESSENTRY32) ; BOOL (WINAPI *lpfProcess32Next)(HANDLE,LPPROCESSENTRY32) ; - + static void InitToolHelp32() { static bool s_initToolHelpDone = false; - + if (s_initToolHelpDone) return; - + s_initToolHelpDone = true; lpfCreateToolhelp32Snapshot = NULL; lpfProcess32First = NULL; lpfProcess32Next = NULL; - + HINSTANCE hInstLib = LoadLibrary( wxT("Kernel32.DLL") ) ; if( hInstLib == NULL ) return ; - + // Get procedure addresses. // We are linking to these functions of Kernel32 // explicitly, because otherwise a module using @@ -849,7 +859,7 @@ static void InitToolHelp32() "CreateToolhelp32Snapshot" #endif ) ; - + lpfProcess32First= (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32)) GetProcAddress( hInstLib, @@ -877,14 +887,14 @@ static void InitToolHelp32() int wxKillAllChildren(long pid, wxSignal sig, wxKillError *krc) { InitToolHelp32(); - + if (krc) *krc = wxKILL_OK; - + // If not implemented for this platform (e.g. NT 4.0), silently ignore if (!lpfCreateToolhelp32Snapshot || !lpfProcess32First || !lpfProcess32Next) return 0; - + // Take a snapshot of all processes in the system. HANDLE hProcessSnap = lpfCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) { @@ -892,11 +902,12 @@ int wxKillAllChildren(long pid, wxSignal sig, wxKillError *krc) *krc = wxKILL_ERROR; return -1; } - + //Fill in the size of the structure before using it. - PROCESSENTRY32 pe = {0}; + PROCESSENTRY32 pe; + wxZeroMemory(pe); pe.dwSize = sizeof(PROCESSENTRY32); - + // Walk the snapshot of the processes, and for each process, // kill it if its parent is pid. if (!lpfProcess32First(hProcessSnap, &pe)) { @@ -906,15 +917,15 @@ int wxKillAllChildren(long pid, wxSignal sig, wxKillError *krc) CloseHandle (hProcessSnap); return -1; } - + do { if (pe.th32ParentProcessID == (DWORD) pid) { if (wxKill(pe.th32ProcessID, sig, krc)) return -1; } } while (lpfProcess32Next (hProcessSnap, &pe)); - - + + return 0; } @@ -949,6 +960,8 @@ bool wxShell(const wxString& command) bool wxShutdown(wxShutdownFlags wFlags) { #ifdef __WXWINCE__ + // TODO-CE + wxUnusedVar(wFlags); return false; #elif defined(__WIN32__) bool bOK = true; @@ -1005,20 +1018,35 @@ bool wxShutdown(wxShutdownFlags wFlags) #endif // Win32/16 } +wxPowerType wxGetPowerType() +{ + // TODO + return wxPOWER_UNKNOWN; +} + +wxBatteryState wxGetBatteryState() +{ + // TODO + return wxBATTERY_UNKNOWN_STATE; +} + // ---------------------------------------------------------------------------- // misc // ---------------------------------------------------------------------------- // Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX) -long wxGetFreeMemory() +wxMemorySize wxGetFreeMemory() { -#if defined(__WIN32__) && !defined(__BORLANDC__) +#if defined(__WIN64__) + MEMORYSTATUSEX memStatex; + statex.dwLength = sizeof (statex); + ::GlobalMemoryStatusEx (&statex); + return (wxMemorySize)memStatus.ullAvailPhys; +#else /* if defined(__WIN32__) */ MEMORYSTATUS memStatus; memStatus.dwLength = sizeof(MEMORYSTATUS); - GlobalMemoryStatus(&memStatus); - return memStatus.dwAvailPhys; -#else - return (long)GetFreeSpace(0); + ::GlobalMemoryStatus(&memStatus); + return (wxMemorySize)memStatus.dwAvailPhys; #endif } @@ -1033,6 +1061,25 @@ void wxBell() ::MessageBeep((UINT)-1); // default sound } +bool wxIsDebuggerRunning() +{ + // IsDebuggerPresent() is not available under Win95, so load it dynamically + wxDynamicLibrary dll(_T("kernel32.dll"), wxDL_VERBATIM); + + typedef BOOL (WINAPI *IsDebuggerPresent_t)(); + if ( !dll.HasSymbol(_T("IsDebuggerPresent")) ) + { + // no way to know, assume no + return false; + } + + return (*(IsDebuggerPresent_t)dll.GetSymbol(_T("IsDebuggerPresent")))() != 0; +} + +// ---------------------------------------------------------------------------- +// OS version +// ---------------------------------------------------------------------------- + wxString wxGetOsDescription() { wxString str; @@ -1153,6 +1200,11 @@ wxToolkitInfo& wxAppTraits::GetToolkitInfo() s_major = info.dwMajorVersion; s_minor = info.dwMinorVersion; +#ifdef __SMARTPHONE__ + s_ver = wxWINDOWS_SMARTPHONE; +#elif defined(__POCKETPC__) + s_ver = wxWINDOWS_POCKETPC; +#else switch ( info.dwPlatformId ) { case VER_PLATFORM_WIN32s: @@ -1169,9 +1221,9 @@ wxToolkitInfo& wxAppTraits::GetToolkitInfo() #ifdef __WXWINCE__ case VER_PLATFORM_WIN32_CE: s_ver = wxWINDOWS_CE; - break; #endif } +#endif } } @@ -1279,23 +1331,77 @@ extern WXDLLIMPEXP_BASE long wxEncodingToCharset(wxFontEncoding encoding) extern WXDLLIMPEXP_BASE long wxEncodingToCodepage(wxFontEncoding encoding) { - // translate encoding into the Windows CHARSET - long charset = wxEncodingToCharset(encoding); - if ( charset == -1 ) - return -1; + // There don't seem to be symbolic names for + // these under Windows so I just copied the + // values from MSDN. + + unsigned int ret; - // translate CHARSET to code page - CHARSETINFO csetInfo; - if ( !::TranslateCharsetInfo((DWORD *)(DWORD)charset, - &csetInfo, - TCI_SRCCHARSET) ) + switch (encoding) { - wxLogLastError(_T("TranslateCharsetInfo(TCI_SRCCHARSET)")); + case wxFONTENCODING_ISO8859_1: ret = 28591; break; + case wxFONTENCODING_ISO8859_2: ret = 28592; break; + case wxFONTENCODING_ISO8859_3: ret = 28593; break; + case wxFONTENCODING_ISO8859_4: ret = 28594; break; + case wxFONTENCODING_ISO8859_5: ret = 28595; break; + case wxFONTENCODING_ISO8859_6: ret = 28596; break; + case wxFONTENCODING_ISO8859_7: ret = 28597; break; + 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_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_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_CP855: ret = 855; break; + case wxFONTENCODING_CP866: ret = 866; break; + case wxFONTENCODING_CP874: ret = 874; break; + case wxFONTENCODING_CP932: ret = 932; break; + case wxFONTENCODING_CP936: ret = 936; break; + case wxFONTENCODING_CP949: ret = 949; break; + case wxFONTENCODING_CP950: ret = 950; break; + case wxFONTENCODING_CP1250: ret = 1250; break; + case wxFONTENCODING_CP1251: ret = 1251; break; + case wxFONTENCODING_CP1252: ret = 1252; break; + case wxFONTENCODING_CP1253: ret = 1253; break; + case wxFONTENCODING_CP1254: ret = 1254; break; + case wxFONTENCODING_CP1255: ret = 1255; break; + case wxFONTENCODING_CP1256: ret = 1256; break; + case wxFONTENCODING_CP1257: ret = 1257; break; + case wxFONTENCODING_EUC_JP: ret = 51932; break; + case wxFONTENCODING_MACROMAN: ret = 10000; break; + case wxFONTENCODING_MACJAPANESE: ret = 10001; break; + case wxFONTENCODING_MACCHINESETRAD: ret = 10002; break; + case wxFONTENCODING_MACKOREAN: ret = 10003; break; + case wxFONTENCODING_MACARABIC: ret = 10004; break; + case wxFONTENCODING_MACHEBREW: ret = 10005; break; + case wxFONTENCODING_MACGREEK: ret = 10006; break; + case wxFONTENCODING_MACCYRILLIC: ret = 10007; break; + case wxFONTENCODING_MACTHAI: ret = 10021; break; + case wxFONTENCODING_MACCHINESESIMP: ret = 10008; break; + case wxFONTENCODING_MACCENTRALEUR: ret = 10029; break; + case wxFONTENCODING_MACCROATIAN: ret = 10082; break; + case wxFONTENCODING_MACICELANDIC: ret = 10079; break; + case wxFONTENCODING_MACROMANIAN: ret = 10009; break; + case wxFONTENCODING_UTF7: ret = 65000; break; + case wxFONTENCODING_UTF8: ret = 65001; break; + default: return -1; + } + if (::IsValidCodePage(ret) == 0) + return -1; + + CPINFO info; + if (::GetCPInfo(ret, &info) == 0) return -1; - } - return csetInfo.ciACP; + return (long) ret; } extern long wxCharsetToCodepage(const wxChar *name) @@ -1304,7 +1410,7 @@ extern long wxCharsetToCodepage(const wxChar *name) if ( !name ) return -1; - wxFontEncoding enc = wxFontMapper::Get()->CharsetToEncoding(name, false); + wxFontEncoding enc = wxFontMapperBase::Get()->CharsetToEncoding(name, false); if ( enc == wxFONTENCODING_SYSTEM ) return -1;