#include "wx/apptrait.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
#endif
#endif
+// 260 was taken from windef.h
+#ifndef MAX_PATH
+ #define MAX_PATH 260
+#endif
+
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
static const wxChar WX_SECTION[] = wxT("wxWindows");
static const wxChar eUSERNAME[] = wxT("UserName");
-// these are only used under Win16
-#if !defined(__WIN32__) && !defined(__WXMICROWIN__)
-static const wxChar eHOSTNAME[] = wxT("HostName");
-static const wxChar eUSERID[] = wxT("UserId");
-#endif // !Win32
-
// ============================================================================
// implementation
// ============================================================================
bool wxGetHostName(wxChar *buf, int maxSize)
{
#if defined(__WXWINCE__)
- return FALSE;
+ return false;
#elif defined(__WIN32__) && !defined(__WXMICROWIN__)
DWORD nSize = maxSize;
if ( !::GetComputerName(buf, &nSize) )
{
wxLogLastError(wxT("GetComputerName"));
- return FALSE;
+ return false;
}
return TRUE;
// TODO should use GetComputerNameEx() when available
// we don't want to always link with Winsock DLL as we might not use it at
- // all, so load it dynamically here if needed
+ // all, so load it dynamically here if needed (and don't complain if it is
+ // missing, we handle this)
+ wxLogNull noLog;
+
wxDynamicLibrary dllWinsock(_T("ws2_32.dll"), wxDL_VERBATIM);
if ( dllWinsock.IsLoaded() )
{
bool wxGetUserId(wxChar *buf, int maxSize)
{
#if defined(__WXWINCE__)
- return FALSE;
-#elif defined(__WIN32__) && !defined(__win32s__) && !defined(__WXMICROWIN__)
+ return false;
+#elif defined(__WIN32__) && !defined(__WXMICROWIN__)
DWORD nSize = maxSize;
if ( ::GetUserName(buf, &nSize) == 0 )
{
}
return TRUE;
-#else // Win16 or Win32s
+#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
bool wxGetUserName(wxChar *buf, int maxSize)
{
#if defined(__WXWINCE__)
- return FALSE;
+ 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 = "";
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 )
{
const wxChar* wxGetHomeDir(wxString *pstr)
{
- wxString& strDir = *pstr;
+ wxString& strDir = *pstr;
+ // first branch is for Cygwin
#if defined(__UNIX__)
const wxChar *szHome = wxGetenv("HOME");
if ( szHome == NULL ) {
strDir << wxT('/');
#ifdef __CYGWIN__
- // Cygwin returns unix type path but that does not work well
- static wxChar windowsPath[MAX_PATH];
- cygwin_conv_to_full_win32_path(strDir, windowsPath);
- strDir = windowsPath;
+ // Cygwin returns unix type path but that does not work well
+ static wxChar windowsPath[MAX_PATH];
+ cygwin_conv_to_full_win32_path(strDir, windowsPath);
+ strDir = windowsPath;
#endif
#elif defined(__WXWINCE__)
// Nothing
#else
- #ifdef __WIN32__
- strDir.clear();
+ strDir.clear();
- // If we have a valid HOME directory, as is used on many machines that
- // have unix utilities on them, we should use that.
- const wxChar *szHome = wxGetenv(wxT("HOME"));
+ // If we have a valid HOME directory, as is used on many machines that
+ // have unix utilities on them, we should use that.
+ const wxChar *szHome = wxGetenv(wxT("HOME"));
- if ( szHome != NULL )
- {
+ if ( szHome != NULL )
+ {
strDir = szHome;
- }
- else // no HOME, try HOMEDRIVE/PATH
- {
- szHome = wxGetenv(wxT("HOMEDRIVE"));
- if ( szHome != NULL )
+ }
+ else // no HOME, try HOMEDRIVE/PATH
+ {
+ szHome = wxGetenv(wxT("HOMEDRIVE"));
+ if ( szHome != NULL )
strDir << szHome;
- szHome = wxGetenv(wxT("HOMEPATH"));
+ szHome = wxGetenv(wxT("HOMEPATH"));
- if ( szHome != NULL )
- {
+ if ( szHome != NULL )
+ {
strDir << szHome;
// the idea is that under NT these variables have default values
// to set HOMEPATH to something other than "\\", we suppose that he
// knows what he is doing and use the supplied value.
if ( wxStrcmp(szHome, wxT("\\")) == 0 )
- strDir.clear();
- }
- }
+ strDir.clear();
+ }
+ }
- if ( strDir.empty() )
- {
- // If we have a valid USERPROFILE directory, as is the case in
- // Windows NT, 2000 and XP, we should use that as our home directory.
- szHome = wxGetenv(wxT("USERPROFILE"));
+ if ( strDir.empty() )
+ {
+ // If we have a valid USERPROFILE directory, as is the case in
+ // Windows NT, 2000 and XP, we should use that as our home directory.
+ szHome = wxGetenv(wxT("USERPROFILE"));
- if ( szHome != NULL )
+ if ( szHome != NULL )
strDir = szHome;
- }
-
- if ( !strDir.empty() )
- {
- return strDir.c_str();
- }
- //else: fall back to the prograrm directory
- #else // Win16
- // Win16 has no idea about home, so use the executable directory instead
- #endif // WIN16/32
-
- // 260 was taken from windef.h
- #ifndef MAX_PATH
- #define MAX_PATH 260
- #endif
-
- wxString strPath;
- ::GetModuleFileName(::GetModuleHandle(NULL),
- wxStringBuffer(strPath, MAX_PATH), MAX_PATH);
+ }
- // extract the dir name
- wxSplitPath(strPath, &strDir, NULL, NULL);
+ if ( !strDir.empty() )
+ {
+ // sometimes the value of HOME may be "%USERPROFILE%", so reexpand the
+ // value once again, it shouldn't hurt anyhow
+ strDir = wxExpandEnvVars(strDir);
+ }
+ 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);
+ }
#endif // UNIX/Win
- return strDir.c_str();
+ return strDir.c_str();
}
wxChar *wxGetUserHome(const wxString& WXUNUSED(user))
#elif defined(__WIN32__)
DWORD attribs = GetFileAttributes(dir);
return ((attribs != (DWORD)-1) && (attribs & FILE_ATTRIBUTE_DIRECTORY));
-#else // Win16
- #ifdef __BORLANDC__
- struct ffblk fileInfo;
- #else
- struct find_t fileInfo;
- #endif
- // In Borland findfirst has a different argument
- // ordering from _dos_findfirst. But _dos_findfirst
- // _should_ be ok in both MS and Borland... why not?
- #ifdef __BORLANDC__
- return (findfirst(dir, &fileInfo, _A_SUBDIR) == 0 &&
- (fileInfo.ff_attrib & _A_SUBDIR) != 0);
- #else
- return (_dos_findfirst(dir, _A_SUBDIR, &fileInfo) == 0) &&
- ((fileInfo.attrib & _A_SUBDIR) != 0);
- #endif
-#endif // Win32/16
+#endif // Win32/__WXMICROWIN__
}
bool wxGetDiskSpace(const wxString& path, wxLongLong *pTotal, wxLongLong *pFree)
{
#ifdef __WXWINCE__
- return FALSE;
+ return false;
#else
if ( path.empty() )
- return FALSE;
+ return false;
// old w32api don't have ULARGE_INTEGER
#if defined(__WIN32__) && \
{
#ifdef __WXWINCE__
return FALSE;
-#elif defined(__WIN16__)
- const wxChar* ret = wxGetenv(var);
- if ( !ret )
- return FALSE;
-
- if ( value )
- {
- *value = ret;
- }
-
- return TRUE;
#else // Win32
// first get the size of the buffer
DWORD dwRet = ::GetEnvironmentVariable(var, NULL, 0);
}
return TRUE;
-#endif // Win16/32
+#endif // WinCE/32
}
bool wxSetEnv(const wxString& var, const wxChar *value)
// 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
return FALSE;
}
- bOK = ::ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE | EWX_REBOOT, 0) != 0;
+ bOK = ::ExitWindowsEx(flags, 0) != 0;
}
return bOK;
-#else // Win16
- return FALSE;
#endif // Win32/16
}
unsigned long wxGetProcessId()
{
-#ifdef __WIN32__
return ::GetCurrentProcessId();
-#else
- return 0;
-#endif
}
// Emit a beeeeeep
wxString wxGetOsDescription()
{
-#ifdef __WIN32__
wxString str;
OSVERSIONINFO info;
}
return str;
-#else // Win16
- return _("Windows 3.1");
-#endif // Win32/16
}
wxToolkitInfo& wxAppTraits::GetToolkitInfo()
// 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);
}
// ----------------------------------------------------------------------------
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).