X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f6bcfd974ef26faf6f91a62cac09827e09463fd1..2d956b58023a4955313a1c1531bc70a0deb0b831:/src/msw/dialup.cpp diff --git a/src/msw/dialup.cpp b/src/msw/dialup.cpp index 2fff5a9a22..e8480bd8a3 100644 --- a/src/msw/dialup.cpp +++ b/src/msw/dialup.cpp @@ -38,18 +38,22 @@ #include "wx/event.h" #endif -#include "wx/msw/private.h" // must be before #include "dynlib.h" - -#if !wxUSE_DYNLIB_CLASS - #error You need wxUSE_DYNLIB_CLASS to be 1 to compile dialup.cpp. -#endif +#include "wx/timer.h" +#include "wx/app.h" +#include "wx/generic/choicdgg.h" #include "wx/dynlib.h" - #include "wx/dialup.h" -// Doesn't yet compile under VC++ 4, BC++, mingw, Watcom C++: no wininet.h -#if !defined(__BORLANDC__) && !defined(__GNUWIN32_OLD__) && !defined(__GNUWIN32__) && !defined(__WATCOMC__) && ! (defined(__VISUALC__) && (__VISUALC__ < 1020)) +DEFINE_EVENT_TYPE(wxEVT_DIALUP_CONNECTED) +DEFINE_EVENT_TYPE(wxEVT_DIALUP_DISCONNECTED) + +// Doesn't yet compile under VC++ 4, BC++, Watcom C++: no wininet.h +#if !defined(__BORLANDC__) && \ + (!defined(__GNUWIN32__) || wxCHECK_W32API_VERSION(0, 5)) && \ + !defined(__GNUWIN32_OLD__) && \ + !defined(__WATCOMC__) && \ + (!defined(__VISUALC__) || (__VISUALC__ >= 1020)) #include #include @@ -218,17 +222,20 @@ private: // each other wxRasThreadData m_data; + // the handle of rasapi32.dll when it's loaded + wxPluginManager m_dllRas; + // the hidden window we use for passing messages between threads static HWND ms_hwndRas; // the handle of the connection we initiated or 0 if none static HRASCONN ms_hRasConnection; - // the use count of rasapi32.dll - static int ms_nDllCount; - - // the handle of rasapi32.dll when it's loaded - static wxDllType ms_dllRas; + // FIXME: There is probably no reason these really need to + // be static anymore since the dll refcounting is + // handled by wxPluginManager now. Whether or not + // we still _want_ them to be static is another + // issue entirely.. // the pointers to RAS functions static RASDIAL ms_pfnRasDial; @@ -292,9 +299,6 @@ HRASCONN wxDialUpManagerMSW::ms_hRasConnection = 0; HWND wxDialUpManagerMSW::ms_hwndRas = 0; -int wxDialUpManagerMSW::ms_nDllCount = 0; -wxDllType wxDialUpManagerMSW::ms_dllRas = 0; - RASDIAL wxDialUpManagerMSW::ms_pfnRasDial = 0; RASENUMCONNECTIONS wxDialUpManagerMSW::ms_pfnRasEnumConnections = 0; RASENUMENTRIES wxDialUpManagerMSW::ms_pfnRasEnumEntries = 0; @@ -337,89 +341,80 @@ wxDialUpManager *wxDialUpManager::Create() wxDialUpManagerMSW::wxDialUpManagerMSW() : m_timerStatusPolling(this) + , m_dllRas(_T("RASAPI32")) { // initialize our data m_hThread = 0; - if ( !ms_nDllCount++ ) + if ( !m_dllRas.IsLoaded() ) { - // load the RAS library - ms_dllRas = wxDllLoader::LoadLibrary("RASAPI32"); - if ( !ms_dllRas ) + wxLogError(_("Dial up functions are unavailable because the remote access service (RAS) is not installed on this machine. Please install it.")); + } + else if( ms_pfnRasDial == 0 ) + { + // resolve the functions we need + + // this will contain the name of the function we failed to resolve + // if any at the end + const char *funcName = NULL; + + // get the function from rasapi32.dll and abort if it's not found + #define RESOLVE_RAS_FUNCTION(type, name) \ + ms_pfn##name = (type)m_dllRas.GetSymbol( wxString(_T(#name)) \ + + gs_funcSuffix); \ + if ( !ms_pfn##name ) \ + { \ + funcName = #name; \ + goto exit; \ + } + + // a variant of above macro which doesn't abort if the function is + // not found in the DLL + #define RESOLVE_OPTIONAL_RAS_FUNCTION(type, name) \ + ms_pfn##name = (type)m_dllRas.GetSymbol( wxString(_T(#name)) \ + + gs_funcSuffix); + + RESOLVE_RAS_FUNCTION(RASDIAL, RasDial); + RESOLVE_RAS_FUNCTION(RASENUMCONNECTIONS, RasEnumConnections); + RESOLVE_RAS_FUNCTION(RASENUMENTRIES, RasEnumEntries); + RESOLVE_RAS_FUNCTION(RASGETCONNECTSTATUS, RasGetConnectStatus); + RESOLVE_RAS_FUNCTION(RASGETERRORSTRING, RasGetErrorString); + RESOLVE_RAS_FUNCTION(RASHANGUP, RasHangUp); + RESOLVE_RAS_FUNCTION(RASGETENTRYDIALPARAMS, RasGetEntryDialParams); + + // suppress error messages about missing (non essential) functions { - wxLogError(_("Dial up functions are unavailable because the remote access service (RAS) is not installed on this machine. Please install it.")); + wxLogNull noLog; + + RESOLVE_OPTIONAL_RAS_FUNCTION(RASGETPROJECTIONINFO, RasGetProjectionInfo); + RESOLVE_OPTIONAL_RAS_FUNCTION(RASCREATEPHONEBOOKENTRY, RasCreatePhonebookEntry); + RESOLVE_OPTIONAL_RAS_FUNCTION(RASEDITPHONEBOOKENTRY, RasEditPhonebookEntry); + RESOLVE_OPTIONAL_RAS_FUNCTION(RASSETENTRYDIALPARAMS, RasSetEntryDialParams); + RESOLVE_OPTIONAL_RAS_FUNCTION(RASGETENTRYPROPERTIES, RasGetEntryProperties); + RESOLVE_OPTIONAL_RAS_FUNCTION(RASSETENTRYPROPERTIES, RasSetEntryProperties); + RESOLVE_OPTIONAL_RAS_FUNCTION(RASRENAMEENTRY, RasRenameEntry); + RESOLVE_OPTIONAL_RAS_FUNCTION(RASDELETEENTRY, RasDeleteEntry); + RESOLVE_OPTIONAL_RAS_FUNCTION(RASVALIDATEENTRYNAME, RasValidateEntryName); + RESOLVE_OPTIONAL_RAS_FUNCTION(RASGETCOUNTRYINFO, RasGetCountryInfo); + RESOLVE_OPTIONAL_RAS_FUNCTION(RASENUMDEVICES, RasEnumDevices); + RESOLVE_OPTIONAL_RAS_FUNCTION(RASCONNECTIONNOTIFICATION, RasConnectionNotification); } - else - { - // resolve the functions we need - - // this will contain the name of the function we failed to resolve - // if any at the end - const char *funcName = NULL; - - // get the function from rasapi32.dll and abort if it's not found - #define RESOLVE_RAS_FUNCTION(type, name) \ - ms_pfn##name = (type)wxDllLoader::GetSymbol(ms_dllRas, \ - wxString(_T(#name)) + gs_funcSuffix); \ - if ( !ms_pfn##name ) \ - { \ - funcName = #name; \ - goto exit; \ - } - // a variant of above macro which doesn't abort if the function is - // not found in the DLL - #define RESOLVE_OPTIONAL_RAS_FUNCTION(type, name) \ - ms_pfn##name = (type)wxDllLoader::GetSymbol(ms_dllRas, \ - wxString(_T(#name)) + gs_funcSuffix); - - RESOLVE_RAS_FUNCTION(RASDIAL, RasDial); - RESOLVE_RAS_FUNCTION(RASENUMCONNECTIONS, RasEnumConnections); - RESOLVE_RAS_FUNCTION(RASENUMENTRIES, RasEnumEntries); - RESOLVE_RAS_FUNCTION(RASGETCONNECTSTATUS, RasGetConnectStatus); - RESOLVE_RAS_FUNCTION(RASGETERRORSTRING, RasGetErrorString); - RESOLVE_RAS_FUNCTION(RASHANGUP, RasHangUp); - RESOLVE_RAS_FUNCTION(RASGETENTRYDIALPARAMS, RasGetEntryDialParams); - - // suppress wxDllLoader messages about missing (non essential) - // functions - { - wxLogNull noLog; - - RESOLVE_OPTIONAL_RAS_FUNCTION(RASGETPROJECTIONINFO, RasGetProjectionInfo); - RESOLVE_OPTIONAL_RAS_FUNCTION(RASCREATEPHONEBOOKENTRY, RasCreatePhonebookEntry); - RESOLVE_OPTIONAL_RAS_FUNCTION(RASEDITPHONEBOOKENTRY, RasEditPhonebookEntry); - RESOLVE_OPTIONAL_RAS_FUNCTION(RASSETENTRYDIALPARAMS, RasSetEntryDialParams); - RESOLVE_OPTIONAL_RAS_FUNCTION(RASGETENTRYPROPERTIES, RasGetEntryProperties); - RESOLVE_OPTIONAL_RAS_FUNCTION(RASSETENTRYPROPERTIES, RasSetEntryProperties); - RESOLVE_OPTIONAL_RAS_FUNCTION(RASRENAMEENTRY, RasRenameEntry); - RESOLVE_OPTIONAL_RAS_FUNCTION(RASDELETEENTRY, RasDeleteEntry); - RESOLVE_OPTIONAL_RAS_FUNCTION(RASVALIDATEENTRYNAME, RasValidateEntryName); - RESOLVE_OPTIONAL_RAS_FUNCTION(RASGETCOUNTRYINFO, RasGetCountryInfo); - RESOLVE_OPTIONAL_RAS_FUNCTION(RASENUMDEVICES, RasEnumDevices); - RESOLVE_OPTIONAL_RAS_FUNCTION(RASCONNECTIONNOTIFICATION, RasConnectionNotification); - } - - // keep your preprocessor name space clean - #undef RESOLVE_RAS_FUNCTION - #undef RESOLVE_OPTIONAL_RAS_FUNCTION + // keep your preprocessor name space clean + #undef RESOLVE_RAS_FUNCTION + #undef RESOLVE_OPTIONAL_RAS_FUNCTION exit: - if ( funcName ) - { - static const wxChar *msg = wxTRANSLATE( + 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); - - wxDllLoader::UnloadLibrary(ms_dllRas); - ms_dllRas = 0; - ms_nDllCount = 0; + ); - return; - } + wxLogError(wxGetTranslation(msg), funcName); + m_dllRas.Unload(); + return; } } @@ -430,13 +425,6 @@ old, please upgrade (the following required function is missing: %s)." wxDialUpManagerMSW::~wxDialUpManagerMSW() { CleanUpThreadData(); - - if ( !--ms_nDllCount ) - { - // unload the RAS library - wxDllLoader::UnloadLibrary(ms_dllRas); - ms_dllRas = 0; - } } // ---------------------------------------------------------------------------- @@ -512,7 +500,7 @@ HRASCONN wxDialUpManagerMSW::FindActiveConnection() { // an error occured wxLogError(_("Cannot find active dialup connection: %s"), - GetErrorString(dwRet)); + GetErrorString(dwRet).c_str()); return 0; } } @@ -551,7 +539,7 @@ void wxDialUpManagerMSW::CleanUpThreadData() { if ( !SetEvent(m_data.hEventQuit) ) { - wxLogLastError("SetEvent(RasThreadQuit)"); + wxLogLastError(_T("SetEvent(RasThreadQuit)")); } CloseHandle(m_hThread); @@ -633,7 +621,7 @@ void wxDialUpManagerMSW::OnDialProgress(RASCONNSTATE rasconnstate, if ( dwError ) { wxLogError(_("Failed to establish dialup connection: %s"), - GetErrorString(dwError)); + GetErrorString(dwError).c_str()); // we should still call RasHangUp() if we got a non 0 connection if ( ms_hRasConnection ) @@ -661,7 +649,7 @@ void wxDialUpManagerMSW::OnDialProgress(RASCONNSTATE rasconnstate, bool wxDialUpManagerMSW::IsOk() const { - return ms_dllRas != 0; + return m_dllRas.IsLoaded(); } size_t wxDialUpManagerMSW::GetISPNames(wxArrayString& names) const @@ -692,7 +680,8 @@ size_t wxDialUpManagerMSW::GetISPNames(wxArrayString& names) const else if ( dwRet != 0 ) { // some other error - abort - wxLogError(_("Failed to get ISP names: %s"), GetErrorString(dwRet)); + wxLogError(_("Failed to get ISP names: %s"), + GetErrorString(dwRet).c_str()); free(rasEntries); @@ -798,13 +787,13 @@ bool wxDialUpManagerMSW::Dial(const wxString& nameOfISP, return FALSE; } } - else - { - wxStrncpy(rasDialParams.szUserName, username, UNLEN); - wxStrncpy(rasDialParams.szPassword, password, PWLEN); - } + else + { + wxStrncpy(rasDialParams.szUserName, username, UNLEN); + wxStrncpy(rasDialParams.szPassword, password, PWLEN); + } - // default values for other fields + // default values for other fields rasDialParams.szPhoneNumber[0] = '\0'; rasDialParams.szCallbackNumber[0] = '\0'; rasDialParams.szCallbackNumber[0] = '\0'; @@ -852,9 +841,10 @@ bool wxDialUpManagerMSW::Dial(const wxString& nameOfISP, if ( dwRet != 0 ) { + // can't pass a wxWCharBuffer through ( ... ) wxLogError(_("Failed to %s dialup connection: %s"), - async ? _("initiate") : _("establish"), - GetErrorString(dwRet)); + wxString(async ? _("initiate") : _("establish")).c_str(), + GetErrorString(dwRet).c_str()); // we should still call RasHangUp() if we got a non 0 connection if ( ms_hRasConnection ) @@ -926,7 +916,7 @@ bool wxDialUpManagerMSW::HangUp() if ( dwRet != 0 ) { wxLogError(_("Failed to terminate the dialup connection: %s"), - GetErrorString(dwRet)); + GetErrorString(dwRet).c_str()); } ms_isConnected = FALSE; @@ -944,15 +934,19 @@ bool wxDialUpManagerMSW::IsAlwaysOnline() const } // try to use WinInet function first - bool ok; - wxDllType hDll = wxDllLoader::LoadLibrary(_T("WININET"), &ok); - if ( ok ) + + // NB: we could probably use wxDynamicLibrary here just as well, + // but we allow multiple instances of wxDialUpManagerMSW so + // we might as well use the ref counted version here too. + + wxPluginManager hDll(_T("WININET")); + if ( hDll.IsLoaded() ) { - typedef BOOL (*INTERNETGETCONNECTEDSTATE)(LPDWORD, DWORD); + typedef BOOL (WINAPI *INTERNETGETCONNECTEDSTATE)(LPDWORD, DWORD); INTERNETGETCONNECTEDSTATE pfnInternetGetConnectedState; #define RESOLVE_FUNCTION(type, name) \ - pfn##name = (type)wxDllLoader::GetSymbol(hDll, _T(#name)) + pfn##name = (type)hDll.GetSymbol(_T(#name)) RESOLVE_FUNCTION(INTERNETGETCONNECTEDSTATE, InternetGetConnectedState); @@ -962,8 +956,8 @@ bool wxDialUpManagerMSW::IsAlwaysOnline() const if ( pfnInternetGetConnectedState(&flags, 0 /* reserved */) ) { // there is some connection to the net, see of which type - ms_isAlwaysOnline = (flags & INTERNET_CONNECTION_LAN != 0) || - (flags & INTERNET_CONNECTION_PROXY != 0); + ms_isAlwaysOnline = ((flags & INTERNET_CONNECTION_LAN) != 0) + || ((flags & INTERNET_CONNECTION_PROXY) != 0); } else { @@ -971,8 +965,6 @@ bool wxDialUpManagerMSW::IsAlwaysOnline() const ms_isAlwaysOnline = FALSE; } } - - wxDllLoader::UnloadLibrary(hDll); } // did we succeed with WinInet? if not, try something else @@ -1094,8 +1086,8 @@ bool wxDialUpManagerMSW::EnableAutoCheckOnlineStatus(size_t nSeconds) { // create a hidden window to receive notification about connections // status change - extern const wxChar *wxPanelClassName; - ms_hwndRas = ::CreateWindow(wxPanelClassName, NULL, + extern const wxChar *wxCanvasClassName; + ms_hwndRas = ::CreateWindow(wxCanvasClassName, NULL, 0, 0, 0, 0, 0, NULL, (HMENU)NULL, wxGetInstance(), 0); @@ -1157,7 +1149,7 @@ bool wxDialUpManagerMSW::EnableAutoCheckOnlineStatus(size_t nSeconds) if ( dwRet != 0 ) { wxLogDebug(wxT("RasConnectionNotification() failed: %s"), - GetErrorString(dwRet)); + GetErrorString(dwRet).c_str()); CleanUpThreadData(); } @@ -1288,3 +1280,5 @@ static void WINAPI wxRasDialFunc(UINT unMsg, #endif // __BORLANDC__ #endif // wxUSE_DIALUP_MANAGER + +// vi:sts=4:sw=4:et