+#endif // MSW
+}
+
+// Yield to other apps/messages and disable user input to all windows except
+// the given one
+bool wxSafeYield(wxWindow *win)
+{
+ wxWindowDisabler wd;
+
+ bool rc = wxYield();
+
+ return rc;
+}
+
+// ----------------------------------------------------------------------------
+// misc functions
+// ----------------------------------------------------------------------------
+
+// Don't synthesize KeyUp events holding down a key and producing KeyDown
+// events with autorepeat. On by default and always on in wxMSW. wxGTK version
+// in utilsgtk.cpp.
+#ifndef __WXGTK__
+bool wxSetDetectableAutoRepeat( bool WXUNUSED(flag) )
+{
+ return TRUE; // detectable auto-repeat is the only mode MSW supports
+}
+#endif // !wxGTK
+
+#endif // wxUSE_GUI
+
+// ----------------------------------------------------------------------------
+// network and user id functions
+// ----------------------------------------------------------------------------
+
+// Get Full RFC822 style email address
+bool wxGetEmailAddress(wxChar *address, int maxSize)
+{
+ wxString email = wxGetEmailAddress();
+ if ( !email )
+ return FALSE;
+
+ wxStrncpy(address, email, maxSize - 1);
+ address[maxSize - 1] = wxT('\0');
+
+ return TRUE;
+}
+
+wxString wxGetEmailAddress()
+{
+ wxString email;
+
+ wxString host = wxGetHostName();
+ if ( !!host )
+ {
+ wxString user = wxGetUserId();
+ if ( !!user )
+ {
+ wxString email(user);
+ email << wxT('@') << host;
+ }
+ }
+
+ return email;
+}
+
+wxString wxGetUserId()
+{
+ static const int maxLoginLen = 256; // FIXME arbitrary number
+
+ wxString buf;
+ bool ok = wxGetUserId(buf.GetWriteBuf(maxLoginLen), maxLoginLen);
+ buf.UngetWriteBuf();
+
+ if ( !ok )
+ buf.Empty();
+
+ return buf;
+}
+
+wxString wxGetUserName()
+{
+ static const int maxUserNameLen = 1024; // FIXME arbitrary number
+
+ wxString buf;
+ bool ok = wxGetUserName(buf.GetWriteBuf(maxUserNameLen), maxUserNameLen);
+ buf.UngetWriteBuf();
+
+ if ( !ok )
+ buf.Empty();
+
+ return buf;
+}
+
+wxString wxGetHostName()
+{
+ static const size_t hostnameSize = 257;
+
+ wxString buf;
+ bool ok = wxGetHostName(buf.GetWriteBuf(hostnameSize), hostnameSize);
+
+ buf.UngetWriteBuf();
+
+ if ( !ok )
+ buf.Empty();
+
+ return buf;
+}
+
+wxString wxGetFullHostName()
+{
+ static const size_t hostnameSize = 257;
+
+ wxString buf;
+ bool ok = wxGetFullHostName(buf.GetWriteBuf(hostnameSize), hostnameSize);
+
+ buf.UngetWriteBuf();
+
+ if ( !ok )
+ buf.Empty();
+
+ return buf;
+}
+
+wxString wxGetHomeDir()
+{
+ wxString home;
+ wxGetHomeDir(&home);
+
+ return home;
+}
+
+#if 0
+
+wxString wxGetCurrentDir()
+{
+ wxString dir;
+ size_t len = 1024;
+ bool ok;
+ do
+ {
+ ok = getcwd(dir.GetWriteBuf(len + 1), len) != NULL;
+ dir.UngetWriteBuf();
+
+ if ( !ok )
+ {
+ if ( errno != ERANGE )
+ {
+ wxLogSysError(_T("Failed to get current directory"));
+
+ return wxEmptyString;
+ }
+ else
+ {
+ // buffer was too small, retry with a larger one
+ len *= 2;
+ }
+ }
+ //else: ok
+ } while ( !ok );
+
+ return dir;
+}
+
+#endif // 0
+
+// ----------------------------------------------------------------------------
+// wxExecute
+// ----------------------------------------------------------------------------
+
+long wxExecute(const wxString& command, wxArrayString& output)
+{
+ // create a wxProcess which will capture the output
+ wxProcess *process = new wxProcess;
+ process->Redirect();
+
+ long rc = wxExecute(command, TRUE /* sync */, process);
+ if ( rc != -1 )
+ {
+ wxInputStream& is = *process->GetInputStream();
+ wxTextInputStream tis(is);
+ while ( !is.Eof() && is.IsOk() )
+ {
+ wxString line = tis.ReadLine();
+ if ( is.LastError() )
+ break;
+
+ output.Add(line);
+ }
+ }
+
+ return rc;
+}