#endif //WX_PRECOMP
#include "wx/apptrait.h"
+#include "wx/dynlib.h"
#include "wx/dynload.h"
#include "wx/confbase.h" // for wxExpandEnvVars()
#include "wx/msw/private.h" // includes <windows.h>
#include "wx/msw/missing.h" // CHARSET_HANGUL
-#if defined(__GNUWIN32_OLD__) || defined(__WXWINCE__) \
- || defined(__CYGWIN32__)
+#if defined(__CYGWIN__)
+ //CYGWIN gives annoying warning about runtime stuff if we don't do this
+# define USE_SYS_TYPES_FD_SET
+# include <sys/types.h>
+#endif
+
+// 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 <winsock.h>
#endif
#endif
-// 260 was taken from windef.h
-#ifndef MAX_PATH
- #define MAX_PATH 260
-#endif
+// For wxKillAllChildren
+#include <tlhelp32.h>
// ----------------------------------------------------------------------------
// constants
bool wxGetHostName(wxChar *buf, int maxSize)
{
#if defined(__WXWINCE__)
- return FALSE;
+ // TODO-CE
+ wxUnusedVar(buf);
+ wxUnusedVar(maxSize);
+ return false;
#elif defined(__WIN32__) && !defined(__WXMICROWIN__)
DWORD nSize = maxSize;
if ( !::GetComputerName(buf, &nSize) )
{
wxLogLastError(wxT("GetComputerName"));
- return FALSE;
+ return false;
}
- return TRUE;
+ return true;
#else
wxChar *sysname;
const wxChar *default_host = wxT("noname");
} else
wxStrncpy(buf, sysname, maxSize - 1);
buf[maxSize] = wxT('\0');
- return *buf ? TRUE : FALSE;
+ 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
+#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
{
wxStrncpy(buf, host, maxSize);
- return TRUE;
+ return true;
}
}
}
bool wxGetUserId(wxChar *buf, int maxSize)
{
#if defined(__WXWINCE__)
- return FALSE;
+ // TODO-CE
+ wxUnusedVar(buf);
+ wxUnusedVar(maxSize);
+ return false;
#elif defined(__WIN32__) && !defined(__WXMICROWIN__)
DWORD nSize = maxSize;
if ( ::GetUserName(buf, &nSize) == 0 )
if ( res == 0 )
{
// not found
- return FALSE;
+ return false;
}
}
- return TRUE;
+ return true;
#else // __WXMICROWIN__
wxChar *user;
const wxChar *default_id = wxT("anonymous");
if ( (user = wxGetenv(wxT("USER"))) == NULL &&
(user = wxGetenv(wxT("LOGNAME"))) == NULL )
{
- // Use wxWindows configuration data (comming soon)
+ // 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;
+ return *buf ? true : false;
#endif
}
bool wxGetUserName(wxChar *buf, int maxSize)
{
#if defined(__WXWINCE__)
- return FALSE;
+ // TODO-CE
+ wxUnusedVar(buf);
+ wxUnusedVar(maxSize);
+ return false;
#elif defined(USE_NET_API)
CHAR szUserName[256];
if ( !wxGetUserId(szUserName, WXSIZEOF(szUserName)) )
- return FALSE;
+ return false;
// TODO how to get the domain name?
CHAR *szDomain = "";
WideCharToMultiByte( CP_ACP, 0, ui2->usri2_full_name, -1,
buf, maxSize, NULL, NULL );
- return TRUE;
+ return true;
error:
wxLogError(wxT("Couldn't look up full user name."));
- return FALSE;
+ return false;
#else // !USE_NET_API
// Could use NIS, MS-Mail or other site specific programs
- // Use wxWindows configuration data
+ // Use wxWidgets configuration data
bool ok = GetProfileString(WX_SECTION, eUSERNAME, wxEmptyString, buf, maxSize - 1) != 0;
if ( !ok )
{
{
wxStrncpy(buf, wxT("Unknown User"), maxSize);
}
-#endif // Win32/16
- return TRUE;
+ return true;
+#endif // Win32/16
}
const wxChar* wxGetHomeDir(wxString *pstr)
strDir = windowsPath;
#endif
#elif defined(__WXWINCE__)
- // Nothing
+ strDir = wxT("\\");
#else
strDir.clear();
}
else // fall back to the program directory
{
- wxString strPath;
- ::GetModuleFileName(::GetModuleHandle(NULL),
- wxStringBuffer(strPath, MAX_PATH), MAX_PATH);
-
- // extract the dir name
- wxSplitPath(strPath, &strDir, NULL, NULL);
+ // extract the directory component of the program file name
+ wxSplitPath(wxGetFullModuleName(), &strDir, NULL, NULL);
}
#endif // UNIX/Win
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__
- return FALSE;
+ // TODO-CE
+ wxUnusedVar(path);
+ wxUnusedVar(pTotal);
+ wxUnusedVar(pFree);
+ return false;
#else
if ( path.empty() )
- return FALSE;
+ return false;
// old w32api don't have ULARGE_INTEGER
#if defined(__WIN32__) && \
{
wxLogLastError(_T("GetDiskFreeSpaceEx"));
- return FALSE;
+ return false;
}
// ULARGE_INTEGER is a union of a 64 bit value and a struct containing
{
wxLogLastError(_T("GetDiskFreeSpace"));
- return FALSE;
+ return false;
}
wxLongLong lBytesPerCluster = lSectorsPerCluster;
}
}
- return TRUE;
+ return true;
#endif
// __WXWINCE__
}
bool wxGetEnv(const wxString& var, wxString *value)
{
#ifdef __WXWINCE__
- return FALSE;
+ // no environment variables under CE
+ wxUnusedVar(var);
+ wxUnusedVar(value);
+ return false;
#else // Win32
// first get the size of the buffer
DWORD dwRet = ::GetEnvironmentVariable(var, NULL, 0);
if ( !dwRet )
{
// this means that there is no such variable
- return FALSE;
+ return false;
}
if ( value )
dwRet);
}
- return TRUE;
+ return true;
#endif // WinCE/32
}
{
wxLogLastError(_T("SetEnvironmentVariable"));
- return FALSE;
+ return false;
}
- return TRUE;
+ return true;
#else // no way to set env vars
- return FALSE;
+ // no environment variables under CE
+ wxUnusedVar(var);
+ wxUnusedVar(value);
+ return false;
#endif
}
return TRUE;
}
-int wxKill(long pid, wxSignal sig, wxKillError *krc)
+int wxKillAllChildren(long pid, wxSignal sig, wxKillError *krc);
+
+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 |
return -1;
}
- bool ok = TRUE;
+ bool ok = true;
switch ( sig )
{
case wxSIGKILL:
*krc = wxKILL_ERROR;
}
- ok = FALSE;
+ ok = false;
}
break;
{
wxLogLastError(_T("EnumWindows"));
- ok = FALSE;
+ ok = false;
}
}
else // no windows for this PID
*krc = wxKILL_ERROR;
}
- ok = FALSE;
+ ok = false;
}
}
}
return -1;
}
+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
+ // 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
+ ) ;
+
+ lpfProcess32First=
+ (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32))
+ GetProcAddress( hInstLib,
+#ifdef __WXWINCE__
+ wxT("Process32First")
+#else
+ "Process32First"
+#endif
+ ) ;
+
+ lpfProcess32Next=
+ (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32))
+ GetProcAddress( hInstLib,
+#ifdef __WXWINCE__
+ wxT("Process32Next")
+#else
+ "Process32Next"
+#endif
+ ) ;
+
+ FreeLibrary( hInstLib ) ;
+}
+
+// By John Skiff
+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) {
+ if (krc)
+ *krc = wxKILL_ERROR;
+ return -1;
+ }
+
+ //Fill in the size of the structure before using it.
+ 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)) {
+ // Can't get first process.
+ if (krc)
+ *krc = wxKILL_ERROR;
+ CloseHandle (hProcessSnap);
+ return -1;
+ }
+
+ do {
+ if (pe.th32ParentProcessID == (DWORD) pid) {
+ if (wxKill(pe.th32ProcessID, sig, krc))
+ return -1;
+ }
+ } while (lpfProcess32Next (hProcessSnap, &pe));
+
+
+ return 0;
+}
+
// Execute a program in an Interactive Shell
bool wxShell(const wxString& command)
{
+ wxString cmd;
+
#ifdef __WXWINCE__
- return FALSE;
+ cmd = command;
#else
wxChar *shell = wxGetenv(wxT("COMSPEC"));
if ( !shell )
shell = (wxChar*) wxT("\\COMMAND.COM");
- wxString cmd;
if ( !command )
{
// just the shell
// pass the command to execute to the command processor
cmd.Printf(wxT("%s /c %s"), shell, command.c_str());
}
+#endif
return wxExecute(cmd, wxEXEC_SYNC) == 0;
-#endif
}
// Shutdown or reboot the PC
bool wxShutdown(wxShutdownFlags wFlags)
{
#ifdef __WXWINCE__
- return FALSE;
+ // TODO-CE
+ wxUnusedVar(wFlags);
+ return false;
#elif defined(__WIN32__)
- bool bOK = TRUE;
+ bool bOK = true;
if ( wxGetOsVersion(NULL, NULL) == wxWINDOWS_NT ) // if is NT or 2K
{
default:
wxFAIL_MSG( _T("unknown wxShutdown() flag") );
- return FALSE;
+ return false;
}
bOK = ::ExitWindowsEx(flags, 0) != 0;
#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
}
::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;
break;
case VER_PLATFORM_WIN32_WINDOWS:
- str.Printf(_("Windows 9%c"),
- info.dwMinorVersion == 0 ? _T('5') : _T('8'));
+ switch (info.dwMinorVersion)
+ {
+ case 0:
+ if ( info.szCSDVersion[1] == 'B' ||
+ info.szCSDVersion[1] == 'C' )
+ {
+ str = _("Windows 95 OSR2");
+ }
+ else
+ {
+ str = _("Windows 95");
+ }
+ break;
+ case 10:
+ if ( info.szCSDVersion[1] == 'B' ||
+ info.szCSDVersion[1] == 'C' )
+ {
+ str = _("Windows 98 SE");
+ }
+ else
+ {
+ str = _("Windows 98");
+ }
+ break;
+ case 90:
+ str = _("Windows ME");
+ break;
+ default:
+ str.Printf(_("Windows 9x (%d.%d)"),
+ info.dwMajorVersion,
+ info.dwMinorVersion);
+ break;
+ }
if ( !wxIsEmpty(info.szCSDVersion) )
{
str << _T(" (") << info.szCSDVersion << _T(')');
break;
case VER_PLATFORM_WIN32_NT:
- str.Printf(_T("Windows NT %lu.%lu (build %lu"),
+ if ( info.dwMajorVersion == 5 )
+ {
+ 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"),
+ info.dwBuildNumber);
+ break;
+ }
+ }
+ if ( wxIsEmpty(str) )
+ {
+ str.Printf(_("Windows NT %lu.%lu (build %lu"),
info.dwMajorVersion,
info.dwMinorVersion,
info.dwBuildNumber);
+ }
if ( !wxIsEmpty(info.szCSDVersion) )
{
str << _T(", ") << info.szCSDVersion;
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:
#ifdef __WXWINCE__
case VER_PLATFORM_WIN32_CE:
s_ver = wxWINDOWS_CE;
- break;
#endif
}
+#endif
}
}
// sleep functions
// ----------------------------------------------------------------------------
-void wxUsleep(unsigned long milliseconds)
+void wxMilliSleep(unsigned long milliseconds)
{
::Sleep(milliseconds);
}
+void wxMicroSleep(unsigned long microseconds)
+{
+ wxMilliSleep(microseconds/1000);
+}
+
void wxSleep(int nSecs)
{
- wxUsleep(1000*nSecs);
+ wxMilliSleep(1000*nSecs);
}
// ----------------------------------------------------------------------------
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)
if ( !name )
return -1;
- wxFontEncoding enc = wxFontMapper::Get()->CharsetToEncoding(name, FALSE);
+ wxFontEncoding enc = wxFontMapperBase::Get()->CharsetToEncoding(name, false);
if ( enc == wxFONTENCODING_SYSTEM )
return -1;
Creates a hidden window with supplied window proc registering the class for
it if necesssary (i.e. the first time only). Caller is responsible for
destroying the window and unregistering the class (note that this must be
- done because wxWindows may be used as a DLL and so may be loaded/unloaded
+ done because wxWidgets may be used as a DLL and so may be loaded/unloaded
multiple times into/from the same process so we cna't rely on automatic
Windows class unregistration).