X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/250e67305d386908fa0eda14110b5dd49a936e43..e65a6cc1ec5537dc7f19f89e10cdfaae54adb264:/src/msw/dialup.cpp diff --git a/src/msw/dialup.cpp b/src/msw/dialup.cpp index 0fc8e9eb32..66a5a034fa 100644 --- a/src/msw/dialup.cpp +++ b/src/msw/dialup.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: msw/dialup.cpp +// Name: src/msw/dialup.cpp // Purpose: MSW implementation of network/dialup classes and functions // Author: Vadim Zeitlin // Modified by: @@ -26,21 +26,23 @@ #if wxUSE_DIALUP_MANAGER +#include "wx/dialup.h" + #ifndef WX_PRECOMP #include "wx/log.h" #include "wx/intl.h" #include "wx/event.h" + #include "wx/app.h" + #include "wx/timer.h" + #include "wx/module.h" #endif -#include "wx/timer.h" -#include "wx/app.h" #include "wx/generic/choicdgg.h" #include "wx/dynlib.h" -#include "wx/dialup.h" -DEFINE_EVENT_TYPE(wxEVT_DIALUP_CONNECTED) -DEFINE_EVENT_TYPE(wxEVT_DIALUP_DISCONNECTED) +wxDEFINE_EVENT( wxEVT_DIALUP_CONNECTED, wxDialUpEvent ); +wxDEFINE_EVENT( wxEVT_DIALUP_DISCONNECTED, wxDialUpEvent ); // Doesn't yet compile under VC++ 4, BC++, Watcom C++, // Wine: no wininet.h @@ -63,6 +65,14 @@ DEFINE_EVENT_TYPE(wxEVT_DIALUP_DISCONNECTED) #define INTERNET_CONNECTION_PROXY 4 #endif +// implemented in utils.cpp +extern "C" WXDLLIMPEXP_BASE HWND +wxCreateHiddenWindow(LPCTSTR *pclassname, LPCTSTR classname, WNDPROC wndproc); + +static const wxChar * + wxMSWDIALUP_WNDCLASSNAME = wxT("_wxDialUpManager_Internal_Class"); +static const wxChar *gs_classForDialUpWindow = NULL; + // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -153,7 +163,7 @@ struct WXDLLEXPORT wxRasThreadData HANDLE hEventRas, // automatic event which RAS signals when status changes hEventQuit; // manual event which we signal when we terminate - class WXDLLEXPORT wxDialUpManagerMSW *dialUpManager; // the owner + class WXDLLIMPEXP_FWD_CORE wxDialUpManagerMSW *dialUpManager; // the owner }; // ---------------------------------------------------------------------------- @@ -179,7 +189,7 @@ public: virtual bool HangUp(); virtual bool IsAlwaysOnline() const; virtual bool IsOnline() const; - virtual void SetOnlineStatus(bool isOnline = TRUE); + virtual void SetOnlineStatus(bool isOnline = true); virtual bool EnableAutoCheckOnlineStatus(size_t nSeconds); virtual void DisableAutoCheckOnlineStatus(); virtual void SetWellKnownHost(const wxString& hostname, int port); @@ -195,6 +205,7 @@ public: // for wxRasDialFunc static HWND GetRasWindow() { return ms_hwndRas; } + static void ResetRasWindow() { ms_hwndRas = NULL; } static wxDialUpManagerMSW *GetDialer() { return ms_dialer; } private: @@ -205,7 +216,7 @@ private: static HRASCONN FindActiveConnection(); // notify the application about status change - void NotifyApp(bool connected, bool fromOurselves = FALSE) const; + void NotifyApp(bool connected, bool fromOurselves = false) const; // destroy the thread data and the thread itself void CleanUpThreadData(); @@ -226,7 +237,7 @@ private: private: wxDialUpManagerMSW *m_dialUpManager; - DECLARE_NO_COPY_CLASS(RasTimer) + wxDECLARE_NO_COPY_CLASS(RasTimer); } m_timerStatusPolling; // thread handle for the thread sitting on connection change event @@ -277,9 +288,36 @@ private: // this flag tells us whether a call to RasDial() is in progress static wxDialUpManagerMSW *ms_dialer; - DECLARE_NO_COPY_CLASS(wxDialUpManagerMSW) + wxDECLARE_NO_COPY_CLASS(wxDialUpManagerMSW); +}; + +// module to destroy helper window created by wxDialUpManagerMSW +class wxDialUpManagerModule : public wxModule +{ +public: + bool OnInit() { return true; } + void OnExit() + { + HWND hwnd = wxDialUpManagerMSW::GetRasWindow(); + if ( hwnd ) + { + ::DestroyWindow(hwnd); + wxDialUpManagerMSW::ResetRasWindow(); + } + + if ( gs_classForDialUpWindow ) + { + ::UnregisterClass(wxMSWDIALUP_WNDCLASSNAME, wxGetInstance()); + gs_classForDialUpWindow = NULL; + } + } + +private: + DECLARE_DYNAMIC_CLASS(wxDialUpManagerModule) }; +IMPLEMENT_DYNAMIC_CLASS(wxDialUpManagerModule, wxModule) + // ---------------------------------------------------------------------------- // private functions // ---------------------------------------------------------------------------- @@ -414,12 +452,10 @@ wxDialUpManagerMSW::wxDialUpManagerMSW() exit: if ( funcName ) { - static const wxChar *msg = wxTRANSLATE( -"The version of remote access service (RAS) installed on this machine is too\ -old, please upgrade (the following required function is missing: %s)." - ); - - wxLogError(wxGetTranslation(msg), funcName); + wxLogError(_("The version of remote access service (RAS) installed " + "on this machine is too old, please upgrade (the " + "following required function is missing: %s)."), + funcName); m_dllRas.Unload(); return; } @@ -460,7 +496,7 @@ wxString wxDialUpManagerMSW::GetErrorString(DWORD error) case 0: // we want the error message to start from a lower case letter - buffer[0] = wxTolower(buffer[0]); + buffer[0] = (wxChar)wxTolower(buffer[0]); return wxString(buffer); } @@ -505,7 +541,7 @@ HRASCONN wxDialUpManagerMSW::FindActiveConnection() } else { - // an error occured + // an error occurred wxLogError(_("Cannot find active dialup connection: %s"), GetErrorString(dwRet).c_str()); return 0; @@ -630,14 +666,14 @@ void wxDialUpManagerMSW::OnDialProgress(RASCONNSTATE rasconnstate, ms_dialer = NULL; - NotifyApp(FALSE /* !connected */, TRUE /* we dialed ourselves */); + NotifyApp(false /* !connected */, true /* we dialed ourselves */); } else if ( rasconnstate == RASCS_Connected ) { - ms_isConnected = TRUE; + ms_isConnected = true; ms_dialer = NULL; - NotifyApp(TRUE /* connected */, TRUE /* we dialed ourselves */); + NotifyApp(true /* connected */, true /* we dialed ourselves */); } } @@ -673,7 +709,13 @@ size_t wxDialUpManagerMSW::GetISPNames(wxArrayString& names) const if ( dwRet == ERROR_BUFFER_TOO_SMALL ) { // reallocate the buffer - rasEntries = (RASENTRYNAME *)realloc(rasEntries, size); + void *n = realloc(rasEntries, size); + if (n == NULL) + { + free(rasEntries); + return 0; + } + rasEntries = (RASENTRYNAME *)n; } else if ( dwRet != 0 ) { @@ -707,13 +749,13 @@ bool wxDialUpManagerMSW::Dial(const wxString& nameOfISP, bool async) { // check preconditions - wxCHECK_MSG( IsOk(), FALSE, wxT("using uninitialized wxDialUpManager") ); + wxCHECK_MSG( IsOk(), false, wxT("using uninitialized wxDialUpManager") ); if ( ms_hRasConnection ) { wxFAIL_MSG(wxT("there is already an active connection")); - return TRUE; + return true; } // get the default ISP if none given @@ -728,7 +770,7 @@ bool wxDialUpManagerMSW::Dial(const wxString& nameOfISP, // no known ISPs, abort wxLogError(_("Failed to connect: no ISP to dial.")); - return FALSE; + return false; case 1: // only one ISP, choose it @@ -757,7 +799,7 @@ bool wxDialUpManagerMSW::Dial(const wxString& nameOfISP, if ( !entryName ) { // cancelled by user - return FALSE; + return false; } } } @@ -765,7 +807,7 @@ bool wxDialUpManagerMSW::Dial(const wxString& nameOfISP, RASDIALPARAMS rasDialParams; rasDialParams.dwSize = sizeof(rasDialParams); - wxStrncpy(rasDialParams.szEntryName, entryName, RAS_MaxEntryName); + wxStrlcpy(rasDialParams.szEntryName, entryName.c_str(), RAS_MaxEntryName); // do we have the username and password? if ( !username || !password ) @@ -782,13 +824,13 @@ bool wxDialUpManagerMSW::Dial(const wxString& nameOfISP, { wxLogError(_("Failed to connect: missing username/password.")); - return FALSE; + return false; } } else { - wxStrncpy(rasDialParams.szUserName, username, UNLEN); - wxStrncpy(rasDialParams.szPassword, password, PWLEN); + wxStrlcpy(rasDialParams.szUserName, username.c_str(), UNLEN); + wxStrlcpy(rasDialParams.szPassword, password.c_str(), PWLEN); } // default values for other fields @@ -840,9 +882,12 @@ bool wxDialUpManagerMSW::Dial(const wxString& nameOfISP, if ( dwRet != 0 ) { // can't pass a wxWCharBuffer through ( ... ) - wxLogError(_("Failed to %s dialup connection: %s"), - wxString(async ? _("initiate") : _("establish")).c_str(), - GetErrorString(dwRet).c_str()); + if ( async ) + wxLogError(_("Failed to initiate dialup connection: %s"), + GetErrorString(dwRet).c_str()); + else + wxLogError(_("Failed to establish dialup connection: %s"), + GetErrorString(dwRet).c_str()); // we should still call RasHangUp() if we got a non 0 connection if ( ms_hRasConnection ) @@ -853,16 +898,16 @@ bool wxDialUpManagerMSW::Dial(const wxString& nameOfISP, ms_dialer = NULL; - return FALSE; + return false; } // for async dialing, we're not yet connected if ( !async ) { - ms_isConnected = TRUE; + ms_isConnected = true; } - return TRUE; + return true; } bool wxDialUpManagerMSW::IsDialing() const @@ -875,7 +920,7 @@ bool wxDialUpManagerMSW::CancelDialing() if ( !GetDialer() ) { // silently ignore - return FALSE; + return false; } wxASSERT_MSG( ms_hRasConnection, wxT("dialing but no connection?") ); @@ -887,7 +932,7 @@ bool wxDialUpManagerMSW::CancelDialing() bool wxDialUpManagerMSW::HangUp() { - wxCHECK_MSG( IsOk(), FALSE, wxT("using uninitialized wxDialUpManager") ); + wxCHECK_MSG( IsOk(), false, wxT("using uninitialized wxDialUpManager") ); // we may terminate either the connection we initiated or another one which // is active now @@ -907,25 +952,27 @@ bool wxDialUpManagerMSW::HangUp() { wxLogError(_("Cannot hang up - no active dialup connection.")); - return FALSE; + return false; } - DWORD dwRet = ms_pfnRasHangUp(hRasConn); - if ( dwRet != 0 ) + // note that it's not an error if the connection had been already + // terminated + const DWORD dwRet = ms_pfnRasHangUp(hRasConn); + if ( dwRet != 0 && dwRet != ERROR_NO_CONNECTION ) { wxLogError(_("Failed to terminate the dialup connection: %s"), GetErrorString(dwRet).c_str()); } - ms_isConnected = FALSE; + ms_isConnected = false; - return TRUE; + return true; } bool wxDialUpManagerMSW::IsAlwaysOnline() const { // assume no permanent connection by default - bool isAlwaysOnline = FALSE; + bool isAlwaysOnline = false; // try to use WinInet functions @@ -962,7 +1009,7 @@ bool wxDialUpManagerMSW::IsAlwaysOnline() const bool wxDialUpManagerMSW::IsOnline() const { - wxCHECK_MSG( IsOk(), FALSE, wxT("using uninitialized wxDialUpManager") ); + wxCHECK_MSG( IsOk(), false, wxT("using uninitialized wxDialUpManager") ); if ( IsAlwaysOnline() ) { @@ -977,7 +1024,7 @@ bool wxDialUpManagerMSW::IsOnline() const } else { - // return TRUE if there is at least one active connection + // return true if there is at least one active connection return FindActiveConnection() != 0; } } @@ -991,12 +1038,12 @@ void wxDialUpManagerMSW::SetOnlineStatus(bool isOnline) bool wxDialUpManagerMSW::EnableAutoCheckOnlineStatus(size_t nSeconds) { - wxCHECK_MSG( IsOk(), FALSE, wxT("using uninitialized wxDialUpManager") ); + wxCHECK_MSG( IsOk(), false, wxT("using uninitialized wxDialUpManager") ); if ( m_autoCheckLevel++ ) { // already checking - return TRUE; + return true; } bool ok = ms_pfnRasConnectionNotification != 0; @@ -1010,12 +1057,12 @@ bool wxDialUpManagerMSW::EnableAutoCheckOnlineStatus(size_t nSeconds) if ( m_hThread != 0 ) { if ( ::ResumeThread(m_hThread) != (DWORD)-1 ) - return TRUE; + return true; // we're leaving a zombie thread... but what else can we do? wxLogLastError(wxT("ResumeThread(RasThread)")); - ok = FALSE; + ok = false; } } @@ -1025,7 +1072,7 @@ bool wxDialUpManagerMSW::EnableAutoCheckOnlineStatus(size_t nSeconds) if ( ok ) { // first create an event to wait on - m_data->hEventRas = CreateEvent + m_data->hEventRas = ::CreateEvent ( NULL, // security attribute (default) FALSE, // manual reset (no, it is automatic) @@ -1036,7 +1083,7 @@ bool wxDialUpManagerMSW::EnableAutoCheckOnlineStatus(size_t nSeconds) { wxLogLastError(wxT("CreateEvent(RasStatus)")); - ok = FALSE; + ok = false; } } @@ -1046,7 +1093,7 @@ bool wxDialUpManagerMSW::EnableAutoCheckOnlineStatus(size_t nSeconds) // here avoids problems with missing the event if wxDialUpManagerMSW // is created and destroyed immediately, before wxRasStatusWindowProc // starts waiting on the event - m_data->hEventQuit = CreateEvent + m_data->hEventQuit = ::CreateEvent ( NULL, // default security TRUE, // manual event @@ -1059,7 +1106,7 @@ bool wxDialUpManagerMSW::EnableAutoCheckOnlineStatus(size_t nSeconds) CleanUpThreadData(); - ok = FALSE; + ok = false; } } @@ -1067,22 +1114,20 @@ bool wxDialUpManagerMSW::EnableAutoCheckOnlineStatus(size_t nSeconds) { // create a hidden window to receive notification about connections // status change - extern const wxChar *wxCanvasClassName; - ms_hwndRas = ::CreateWindow(wxCanvasClassName, NULL, - 0, 0, 0, 0, - 0, NULL, - (HMENU)NULL, wxGetInstance(), 0); + ms_hwndRas = wxCreateHiddenWindow + ( + &gs_classForDialUpWindow, + wxMSWDIALUP_WNDCLASSNAME, + wxRasStatusWindowProc + ); if ( !ms_hwndRas ) { wxLogLastError(wxT("CreateWindow(RasHiddenWindow)")); CleanUpThreadData(); - ok = FALSE; + ok = false; } - - // and subclass it - wxSetWindowProc(ms_hwndRas, wxRasStatusWindowProc); } m_data->hWnd = ms_hwndRas; @@ -1130,7 +1175,7 @@ bool wxDialUpManagerMSW::EnableAutoCheckOnlineStatus(size_t nSeconds) } else { - return TRUE; + return true; } } @@ -1144,14 +1189,14 @@ bool wxDialUpManagerMSW::EnableAutoCheckOnlineStatus(size_t nSeconds) } m_timerStatusPolling.Start(nSeconds * 1000); - return TRUE; + return true; } void wxDialUpManagerMSW::DisableAutoCheckOnlineStatus() { wxCHECK_RET( IsOk(), wxT("using uninitialized wxDialUpManager") ); - if ( --m_autoCheckLevel ) + if ( --m_autoCheckLevel != 0 ) { // still checking return; @@ -1202,10 +1247,10 @@ static DWORD wxRasMonitorThread(wxRasThreadData *data) handles[0] = data->hEventRas; handles[1] = data->hEventQuit; - bool cont = TRUE; + bool cont = true; while ( cont ) { - DWORD dwRet = WaitForMultipleObjects(2, handles, FALSE, INFINITE); + DWORD dwRet = ::WaitForMultipleObjects(2, handles, FALSE, INFINITE); switch ( dwRet ) { @@ -1216,7 +1261,7 @@ static DWORD wxRasMonitorThread(wxRasThreadData *data) break; case WAIT_OBJECT_0 + 1: - cont = FALSE; + cont = false; break; default: @@ -1228,7 +1273,8 @@ static DWORD wxRasMonitorThread(wxRasThreadData *data) // using wxLogLastError() from here is dangerous: we risk to // deadlock the main thread if wxLog sends output to GUI DWORD err = GetLastError(); - wxMessageOutputDebug().Printf + wxMessageOutputDebug dbg; + dbg.Printf ( wxT("WaitForMultipleObjects(RasMonitor) failed: 0x%08lx (%s)"), err, @@ -1284,11 +1330,10 @@ static void WINAPI wxRasDialFunc(UINT WXUNUSED(unMsg), wxCHECK_RET( dialUpManager, wxT("who started to dial then?") ); - SendMessage(dialUpManager->GetRasWindow(), wxWM_RAS_DIALING_PROGRESS, + SendMessage(wxDialUpManagerMSW::GetRasWindow(), wxWM_RAS_DIALING_PROGRESS, rasconnstate, dwError); } #endif // __BORLANDC__ #endif // wxUSE_DIALUP_MANAGER -