#include "wx/app.h"
#include "wx/generic/choicdgg.h"
-#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/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 <ras.h>
#include <raserror.h>
// 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;
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;
wxDialUpManagerMSW::wxDialUpManagerMSW()
: m_timerStatusPolling(this)
+ , m_dllRas(_T("RASAPI32"))
{
// initialize our data
m_hThread = 0;
- if ( !ms_nDllCount++ )
+ if ( !m_dllRas.IsLoaded() )
+ {
+ 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 )
{
- // load the RAS library
- ms_dllRas = wxDllLoader::LoadLibrary("RASAPI32");
- if ( !ms_dllRas )
+ // 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;
}
}
wxDialUpManagerMSW::~wxDialUpManagerMSW()
{
CleanUpThreadData();
-
- if ( !--ms_nDllCount )
- {
- // unload the RAS library
- wxDllLoader::UnloadLibrary(ms_dllRas);
- ms_dllRas = 0;
- }
}
// ----------------------------------------------------------------------------
{
// an error occured
wxLogError(_("Cannot find active dialup connection: %s"),
- GetErrorString(dwRet));
+ GetErrorString(dwRet).c_str());
return 0;
}
}
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 )
bool wxDialUpManagerMSW::IsOk() const
{
- return ms_dllRas != 0;
+ return m_dllRas.IsLoaded();
}
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);
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';
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 )
if ( dwRet != 0 )
{
wxLogError(_("Failed to terminate the dialup connection: %s"),
- GetErrorString(dwRet));
+ GetErrorString(dwRet).c_str());
}
ms_isConnected = FALSE;
}
// 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);
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
{
ms_isAlwaysOnline = FALSE;
}
}
-
- wxDllLoader::UnloadLibrary(hDll);
}
// did we succeed with WinInet? if not, try something else
{
// 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);
if ( dwRet != 0 )
{
wxLogDebug(wxT("RasConnectionNotification() failed: %s"),
- GetErrorString(dwRet));
+ GetErrorString(dwRet).c_str());
CleanUpThreadData();
}
#endif
// __BORLANDC__
#endif // wxUSE_DIALUP_MANAGER
+
+// vi:sts=4:sw=4:et