X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/837e57436a89516a5fa9f478f401e06bd872c17c..3c1866e88fb77fc7e0b349cc15f6cebf0f727a9d:/src/msw/utils.cpp diff --git a/src/msw/utils.cpp b/src/msw/utils.cpp index 574c346ba7..3555808464 100644 --- a/src/msw/utils.cpp +++ b/src/msw/utils.cpp @@ -17,14 +17,14 @@ #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif #ifndef WX_PRECOMP -#include "wx/setup.h" -#include "wx/utils.h" -#include "wx/app.h" -#include "wx/cursor.h" + #include "wx/setup.h" + #include "wx/utils.h" + #include "wx/app.h" + #include "wx/cursor.h" #endif //WX_PRECOMP #include "wx/msw/private.h" @@ -36,16 +36,16 @@ #include #if !defined(__GNUWIN32__) && !defined(__WXWINE__) && !defined(__SALFORDC__) -#include + #include -#ifndef __MWERKS__ -#include -#endif + #ifndef __MWERKS__ + #include + #endif #endif //GNUWIN32 #if defined(__GNUWIN32__) && !defined(__TWIN32__) -#include -#include + #include + #include #endif //GNUWIN32 #include "wx/log.h" @@ -53,15 +53,25 @@ #ifdef __BORLANDC__ // Please someone tell me which version of Borland needs // this (3.1 I believe) and how to test for it. // If this works for Borland 4.0 as well, then no worries. -#include + #include #endif +// VZ: there is some code using NetXXX() functions to get the full user name: +// I don't think it's a good idea because they don't work under Win95 and +// seem to return the same as wxGetUserId() under NT. If you really want +// to use them, just #define USE_NET_API +#undef USE_NET_API + +#ifdef USE_NET_API + #include +#endif // USE_NET_API + #if defined(__WIN32__) && !defined(__WXWINE__) -#include + #include -#ifndef __GNUWIN32__ -#include -#endif + #ifndef __GNUWIN32__ + #include + #endif #endif #include @@ -109,10 +119,10 @@ /// END for console support // In the WIN.INI file -static const wxChar WX_SECTION[] = _T("wxWindows"); -static const wxChar eHOSTNAME[] = _T("HostName"); -static const wxChar eUSERID[] = _T("UserId"); -static const wxChar eUSERNAME[] = _T("UserName"); +static const wxChar WX_SECTION[] = wxT("wxWindows"); +static const wxChar eHOSTNAME[] = wxT("HostName"); +static const wxChar eUSERID[] = wxT("UserId"); +static const wxChar eUSERNAME[] = wxT("UserName"); // For the following functions we SHOULD fill in support // for Windows-NT (which I don't know) as I assume it begin @@ -127,13 +137,13 @@ bool wxGetHostName(wxChar *buf, int maxSize) return (::GetComputerName(buf, &nSize) != 0); #else wxChar *sysname; - const wxChar *default_host = _T("noname"); + const wxChar *default_host = wxT("noname"); - if ((sysname = wxGetenv(_T("SYSTEM_NAME"))) == NULL) { + if ((sysname = wxGetenv(wxT("SYSTEM_NAME"))) == NULL) { GetProfileString(WX_SECTION, eHOSTNAME, default_host, buf, maxSize - 1); } else wxStrncpy(buf, sysname, maxSize - 1); - buf[maxSize] = _T('\0'); + buf[maxSize] = wxT('\0'); return *buf ? TRUE : FALSE; #endif } @@ -142,76 +152,36 @@ bool wxGetHostName(wxChar *buf, int maxSize) bool wxGetUserId(wxChar *buf, int maxSize) { #if defined(__WIN32__) && !defined(__win32s__) && !defined(__TWIN32__) - - // VZ: why should it be so complicated?? -#if 0 - // Gets the current user's full name according to the MS article PSS ID - // Number: Q119670 - // Seems to be the same as the login name for me? - char *UserName = new char[256]; - char *Domain = new char[256]; - DWORD maxCharacters = 255; - GetUserName( UserName, &maxCharacters ); - GetComputerName( Domain, &maxCharacters ); - - WCHAR wszUserName[256]; // Unicode user name - WCHAR wszDomain[256]; - LPBYTE ComputerName; - - struct _SERVER_INFO_100 *si100; // Server structure - struct _USER_INFO_2 *ui; // User structure - - // Convert ASCII user name and domain to Unicode. - - MultiByteToWideChar( CP_ACP, 0, UserName, - strlen(UserName)+1, wszUserName, sizeof(wszUserName) ); - MultiByteToWideChar( CP_ACP, 0, Domain, - strlen(Domain)+1, wszDomain, sizeof(wszDomain) ); - - // Get the computer name of a DC for the specified domain. - // >If you get a link error on this, include netapi32.lib< - - NetGetDCName( NULL, wszDomain, &ComputerName ); - - // Look up the user on the DC. - - if(NetUserGetInfo( (LPWSTR) ComputerName, - (LPWSTR) &wszUserName, 2, (LPBYTE *) &ui)) - { - printf( "Error getting user information.\n" ); - return( FALSE ); - } - - // Convert the Unicode full name to ASCII. - - WideCharToMultiByte( CP_ACP, 0, ui->usri2_full_name, - -1, buf, 256, NULL, NULL ); - } - return( TRUE ); -#else // 1 DWORD nSize = maxSize; if ( ::GetUserName(buf, &nSize) == 0 ) { - wxLogSysError(_T("Can not get user name")); - - return FALSE; + // actually, it does happen on Win9x if the user didn't log on + DWORD res = ::GetEnvironmentVariable(wxT("username"), buf, maxSize); + if ( res == 0 ) + { + // not found + return FALSE; + } } return TRUE; -#endif // 0/1 - #else // Win16 or Win32s wxChar *user; - const wxChar *default_id = _T("anonymous"); + const wxChar *default_id = wxT("anonymous"); // Can't assume we have NIS (PC-NFS) or some other ID daemon // So we ... - if ( (user = wxGetenv(_T("USER"))) == NULL && - (user = wxGetenv(_T("LOGNAME"))) == NULL ) { + if ( (user = wxGetenv(wxT("USER"))) == NULL && + (user = wxGetenv(wxT("LOGNAME"))) == NULL ) + { // Use wxWindows configuration data (comming soon) GetProfileString(WX_SECTION, eUSERID, default_id, buf, maxSize - 1); - } else + } + else + { wxStrncpy(buf, user, maxSize - 1); + } + return *buf ? TRUE : FALSE; #endif } @@ -231,9 +201,76 @@ bool wxGetUserName(wxChar *buf, int maxSize) else #endif { +#ifdef USE_NET_API + CHAR szUserName[256]; + if ( !wxGetUserId(szUserName, WXSIZEOF(szUserName)) ) + return FALSE; + + // TODO how to get the domain name? + CHAR *szDomain = ""; + + // the code is based on the MSDN example (also see KB article Q119670) + WCHAR wszUserName[256]; // Unicode user name + WCHAR wszDomain[256]; + LPBYTE ComputerName; + + USER_INFO_2 *ui2; // User structure + + // Convert ANSI user name and domain to Unicode + MultiByteToWideChar( CP_ACP, 0, szUserName, strlen(szUserName)+1, + wszUserName, WXSIZEOF(wszUserName) ); + MultiByteToWideChar( CP_ACP, 0, szDomain, strlen(szDomain)+1, + wszDomain, WXSIZEOF(wszDomain) ); + + // Get the computer name of a DC for the domain. + if ( NetGetDCName( NULL, wszDomain, &ComputerName ) != NERR_Success ) + { + wxLogError(wxT("Can not find domain controller")); + + goto error; + } + + // Look up the user on the DC + NET_API_STATUS status = NetUserGetInfo( (LPWSTR)ComputerName, + (LPWSTR)&wszUserName, + 2, // level - we want USER_INFO_2 + (LPBYTE *) &ui2 ); + switch ( status ) + { + case NERR_Success: + // ok + break; + + case NERR_InvalidComputer: + wxLogError(wxT("Invalid domain controller name.")); + + goto error; + + case NERR_UserNotFound: + wxLogError(wxT("Invalid user name '%s'."), szUserName); + + goto error; + + default: + wxLogSysError(wxT("Can't get information about user")); + + goto error; + } + + // Convert the Unicode full name to ANSI + WideCharToMultiByte( CP_ACP, 0, ui2->usri2_full_name, -1, + buf, maxSize, NULL, NULL ); + + return TRUE; + +error: + wxLogError(wxT("Couldn't look up full user name.")); + + return FALSE; +#else // !USE_NET_API // Could use NIS, MS-Mail or other site specific programs // Use wxWindows configuration data - bool ok = GetProfileString(WX_SECTION, eUSERNAME, _T(""), buf, maxSize - 1) != 0; + bool ok = GetProfileString(WX_SECTION, eUSERNAME, wxT(""), buf, maxSize - 1) != 0; if ( !ok ) { ok = wxGetUserId(buf, maxSize); @@ -241,8 +278,9 @@ bool wxGetUserName(wxChar *buf, int maxSize) if ( !ok ) { - wxStrncpy(buf, _T("Unknown User"), maxSize); + wxStrncpy(buf, wxT("Unknown User"), maxSize); } +#endif // Win32/16 } return TRUE; @@ -260,12 +298,12 @@ bool wxShell(const wxString& command) { wxChar *shell; - if ((shell = wxGetenv(_T("COMSPEC"))) == NULL) - shell = _T("\\COMMAND.COM"); + if ((shell = wxGetenv(wxT("COMSPEC"))) == NULL) + shell = wxT("\\COMMAND.COM"); wxChar tmp[255]; - if (command != _T("")) - wxSprintf(tmp, _T("%s /c %s"), shell, WXSTRINGCAST command); + if (command != wxT("")) + wxSprintf(tmp, wxT("%s /c %s"), shell, WXSTRINGCAST command); else wxStrcpy(tmp, shell); @@ -367,7 +405,7 @@ void wxDebugMsg(const wxChar *fmt ...) // Non-fatal error: pop up message box and (possibly) continue void wxError(const wxString& msg, const wxString& title) { - wxSprintf(wxBuffer, _T("%s\nContinue?"), WXSTRINGCAST msg); + wxSprintf(wxBuffer, wxT("%s\nContinue?"), WXSTRINGCAST msg); if (MessageBox(NULL, (LPCTSTR)wxBuffer, (LPCTSTR)WXSTRINGCAST title, MB_ICONSTOP | MB_YESNO) == IDNO) wxExit(); @@ -376,7 +414,7 @@ void wxError(const wxString& msg, const wxString& title) // Fatal error: pop up message box and abort void wxFatalError(const wxString& msg, const wxString& title) { - wxSprintf(wxBuffer, _T("%s: %s"), WXSTRINGCAST title, WXSTRINGCAST msg); + wxSprintf(wxBuffer, wxT("%s: %s"), WXSTRINGCAST title, WXSTRINGCAST msg); FatalAppExit(0, (LPCTSTR)wxBuffer); } @@ -396,7 +434,6 @@ void wxBell() // detect WindowsNT correctly int wxGetOsVersion(int *majorVsn, int *minorVsn) { - extern char *wxOsVersion; if (majorVsn) *majorVsn = 0; if (minorVsn) *minorVsn = 0; @@ -444,8 +481,14 @@ int wxGetOsVersion(int *majorVsn, int *minorVsn) #if wxUSE_RESOURCES bool wxWriteResource(const wxString& section, const wxString& entry, const wxString& value, const wxString& file) { - if (file != _T("")) + if (file != wxT("")) +// Don't know what the correct cast should be, but it doesn't +// compile in BC++/16-bit without this cast. +#if !defined(__WIN32__) + return (WritePrivateProfileString((const char*) section, (const char*) entry, (const char*) value, (const char*) file) != 0); +#else return (WritePrivateProfileString((LPCTSTR)WXSTRINGCAST section, (LPCTSTR)WXSTRINGCAST entry, (LPCTSTR)value, (LPCTSTR)WXSTRINGCAST file) != 0); +#endif else return (WriteProfileString((LPCTSTR)WXSTRINGCAST section, (LPCTSTR)WXSTRINGCAST entry, (LPCTSTR)WXSTRINGCAST value) != 0); } @@ -453,28 +496,28 @@ bool wxWriteResource(const wxString& section, const wxString& entry, const wxStr bool wxWriteResource(const wxString& section, const wxString& entry, float value, const wxString& file) { wxChar buf[50]; - wxSprintf(buf, _T("%.4f"), value); + wxSprintf(buf, wxT("%.4f"), value); return wxWriteResource(section, entry, buf, file); } bool wxWriteResource(const wxString& section, const wxString& entry, long value, const wxString& file) { wxChar buf[50]; - wxSprintf(buf, _T("%ld"), value); + wxSprintf(buf, wxT("%ld"), value); return wxWriteResource(section, entry, buf, file); } bool wxWriteResource(const wxString& section, const wxString& entry, int value, const wxString& file) { wxChar buf[50]; - wxSprintf(buf, _T("%d"), value); + wxSprintf(buf, wxT("%d"), value); return wxWriteResource(section, entry, buf, file); } bool wxGetResource(const wxString& section, const wxString& entry, wxChar **value, const wxString& file) { - static const wxChar defunkt[] = _T("$$default"); - if (file != _T("")) + static const wxChar defunkt[] = wxT("$$default"); + if (file != wxT("")) { int n = GetPrivateProfileString((LPCTSTR)WXSTRINGCAST section, (LPCTSTR)WXSTRINGCAST entry, (LPCTSTR)defunkt, (LPTSTR)wxBuffer, 1000, (LPCTSTR)WXSTRINGCAST file); @@ -556,7 +599,7 @@ void wxBeginBusyCursor(wxCursor *cursor) void wxEndBusyCursor() { wxCHECK_RET( gs_wxBusyCursorCount > 0, - _T("no matching wxBeginBusyCursor() for wxEndBusyCursor()") ); + wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") ); if ( --gs_wxBusyCursorCount == 0 ) { @@ -582,20 +625,20 @@ const wxChar* wxGetHomeDir(wxString *pstr) if ( szHome == NULL ) { // we're homeless... wxLogWarning(_("can't find user's HOME, using current directory.")); - strDir = _T("."); + strDir = wxT("."); } else strDir = szHome; // add a trailing slash if needed - if ( strDir.Last() != _T('/') ) - strDir << _T('/'); + if ( strDir.Last() != wxT('/') ) + strDir << wxT('/'); #else // Windows #ifdef __WIN32__ - const wxChar *szHome = wxGetenv(_T("HOMEDRIVE")); + const wxChar *szHome = wxGetenv(wxT("HOMEDRIVE")); if ( szHome != NULL ) strDir << szHome; - szHome = wxGetenv(_T("HOMEPATH")); + szHome = wxGetenv(wxT("HOMEPATH")); if ( szHome != NULL ) { strDir << szHome; @@ -605,7 +648,7 @@ const wxChar* wxGetHomeDir(wxString *pstr) // create it in our program's dir. However, if the user took care // to set HOMEPATH to something other than "\\", we suppose that he // knows what he is doing and use the supplied value. - if ( wxStrcmp(szHome, _T("\\")) != 0 ) + if ( wxStrcmp(szHome, wxT("\\")) != 0 ) return strDir.c_str(); } @@ -637,22 +680,22 @@ wxChar *wxGetUserHome (const wxString& user) wxChar *home; wxString user1(user); - if (user1 != _T("")) { + if (user1 != wxT("")) { wxChar tmp[64]; if (wxGetUserId(tmp, sizeof(tmp)/sizeof(char))) { // Guests belong in the temp dir - if (wxStricmp(tmp, _T("annonymous")) == 0) { - if ((home = wxGetenv(_T("TMP"))) != NULL || - (home = wxGetenv(_T("TMPDIR"))) != NULL || - (home = wxGetenv(_T("TEMP"))) != NULL) - return *home ? home : (wxChar*)_T("\\"); + if (wxStricmp(tmp, wxT("annonymous")) == 0) { + if ((home = wxGetenv(wxT("TMP"))) != NULL || + (home = wxGetenv(wxT("TMPDIR"))) != NULL || + (home = wxGetenv(wxT("TEMP"))) != NULL) + return *home ? home : (wxChar*)wxT("\\"); } if (wxStricmp(tmp, WXSTRINGCAST user1) == 0) - user1 = _T(""); + user1 = wxT(""); } } - if (user1 == _T("")) - if ((home = wxGetenv(_T("HOME"))) != NULL) + if (user1 == wxT("")) + if ((home = wxGetenv(wxT("HOME"))) != NULL) { wxStrcpy(wxBuffer, home); Unix2DosFilename(wxBuffer); @@ -675,7 +718,7 @@ bool wxCheckForInterrupt(wxWindow *wnd) return TRUE;//*** temporary? } else{ - wxFAIL_MSG(_T("wnd==NULL !!!")); + wxFAIL_MSG(wxT("wnd==NULL !!!")); return FALSE;//*** temporary? } @@ -1094,26 +1137,26 @@ void OutputDebugStringW95(const wxChar* lpOutputString, ...) } /* make sure DBWIN is open and waiting */ - heventDBWIN = OpenEvent(EVENT_MODIFY_STATE, FALSE, _T("DBWIN_BUFFER_READY")); + heventDBWIN = OpenEvent(EVENT_MODIFY_STATE, FALSE, wxT("DBWIN_BUFFER_READY")); if ( !heventDBWIN ) { - //MessageBox(NULL, _T("DBWIN_BUFFER_READY nonexistent"), NULL, MB_OK); + //MessageBox(NULL, wxT("DBWIN_BUFFER_READY nonexistent"), NULL, MB_OK); return; } /* get a handle to the data synch object */ - heventData = OpenEvent(EVENT_MODIFY_STATE, FALSE, _T("DBWIN_DATA_READY")); + heventData = OpenEvent(EVENT_MODIFY_STATE, FALSE, wxT("DBWIN_DATA_READY")); if ( !heventData ) { - // MessageBox(NULL, _T("DBWIN_DATA_READY nonexistent"), NULL, MB_OK); + // MessageBox(NULL, wxT("DBWIN_DATA_READY nonexistent"), NULL, MB_OK); CloseHandle(heventDBWIN); return; } - hSharedFile = CreateFileMapping((HANDLE)-1, NULL, PAGE_READWRITE, 0, 4096, _T("DBWIN_BUFFER")); + hSharedFile = CreateFileMapping((HANDLE)-1, NULL, PAGE_READWRITE, 0, 4096, wxT("DBWIN_BUFFER")); if (!hSharedFile) { - //MessageBox(NULL, _T("DebugTrace: Unable to create file mapping object DBWIN_BUFFER"), _T("Error"), MB_OK); + //MessageBox(NULL, wxT("DebugTrace: Unable to create file mapping object DBWIN_BUFFER"), wxT("Error"), MB_OK); CloseHandle(heventDBWIN); CloseHandle(heventData); return; @@ -1122,7 +1165,7 @@ void OutputDebugStringW95(const wxChar* lpOutputString, ...) lpszSharedMem = (LPSTR)MapViewOfFile(hSharedFile, FILE_MAP_WRITE, 0, 0, 512); if (!lpszSharedMem) { - //MessageBox(NULL, _T("DebugTrace: Unable to map shared memory"), _T("Error"), MB_OK); + //MessageBox(NULL, wxT("DebugTrace: Unable to map shared memory"), wxT("Error"), MB_OK); CloseHandle(heventDBWIN); CloseHandle(heventData); return; @@ -1138,7 +1181,7 @@ void OutputDebugStringW95(const wxChar* lpOutputString, ...) *((LPDWORD)lpszSharedMem) = _getpid(); #endif - wsprintf((LPTSTR)(lpszSharedMem + sizeof(DWORD)), _T("%s"), achBuffer); + wsprintf((LPTSTR)(lpszSharedMem + sizeof(DWORD)), wxT("%s"), achBuffer); /* signal data ready event */ SetEvent(heventData);