X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d71cc120e315b27466cce577115b9bdf56b1ca55..aa78d22e2008726218d47da1f2ac5864c11b8ebb:/src/msw/dialup.cpp diff --git a/src/msw/dialup.cpp b/src/msw/dialup.cpp index ac394e26ab..074b23c6a5 100644 --- a/src/msw/dialup.cpp +++ b/src/msw/dialup.cpp @@ -38,6 +38,7 @@ #include "wx/dynlib.h" #include "wx/dialup.h" +#include "wx/module.h" DEFINE_EVENT_TYPE(wxEVT_DIALUP_CONNECTED) DEFINE_EVENT_TYPE(wxEVT_DIALUP_DISCONNECTED) @@ -63,6 +64,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 // ---------------------------------------------------------------------------- @@ -195,6 +204,7 @@ public: // for wxRasDialFunc static HWND GetRasWindow() { return ms_hwndRas; } + static void ResetRasWindow() { ms_hwndRas = NULL; } static wxDialUpManagerMSW *GetDialer() { return ms_dialer; } private: @@ -280,6 +290,33 @@ private: DECLARE_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 // ---------------------------------------------------------------------------- @@ -460,7 +497,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 +542,7 @@ HRASCONN wxDialUpManagerMSW::FindActiveConnection() } else { - // an error occured + // an error occurred wxLogError(_("Cannot find active dialup connection: %s"), GetErrorString(dwRet).c_str()); return 0; @@ -910,8 +947,10 @@ bool wxDialUpManagerMSW::HangUp() 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()); @@ -1067,11 +1106,12 @@ 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)")); @@ -1080,9 +1120,6 @@ bool wxDialUpManagerMSW::EnableAutoCheckOnlineStatus(size_t nSeconds) ok = false; } - - // and subclass it - wxSetWindowProc(ms_hwndRas, wxRasStatusWindowProc); } m_data->hWnd = ms_hwndRas; @@ -1151,7 +1188,7 @@ void wxDialUpManagerMSW::DisableAutoCheckOnlineStatus() { wxCHECK_RET( IsOk(), wxT("using uninitialized wxDialUpManager") ); - if ( --m_autoCheckLevel ) + if ( --m_autoCheckLevel != 0 ) { // still checking return; @@ -1228,7 +1265,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,7 +1322,7 @@ 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); }