/////////////////////////////////////////////////////////////////////////////
-// Name: msw/dialup.cpp
+// Name: src/msw/dialup.cpp
// Purpose: MSW implementation of network/dialup classes and functions
// Author: Vadim Zeitlin
// Modified by:
#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)
#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
// ----------------------------------------------------------------------------
// for wxRasDialFunc
static HWND GetRasWindow() { return ms_hwndRas; }
+ static void ResetRasWindow() { ms_hwndRas = NULL; }
static wxDialUpManagerMSW *GetDialer() { return ms_dialer; }
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
// ----------------------------------------------------------------------------
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);
}
}
else
{
- // an error occured
+ // an error occurred
wxLogError(_("Cannot find active dialup connection: %s"),
GetErrorString(dwRet).c_str());
return 0;
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 )
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());
{
// 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)"));
ok = false;
}
-
- // and subclass it
- wxSetWindowProc(ms_hwndRas, wxRasStatusWindowProc);
}
m_data->hWnd = ms_hwndRas;
{
wxCHECK_RET( IsOk(), wxT("using uninitialized wxDialUpManager") );
- if ( --m_autoCheckLevel )
+ if ( --m_autoCheckLevel != 0 )
{
// still checking
return;
// 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,
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
-