more wxSocket code wx-ification: use wxDynamicLibrary instead of raw Win32 calls

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57556 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-12-25 20:03:15 +00:00
parent 9508a3e9a0
commit d8abb95f4a

View File

@@ -31,12 +31,11 @@
#include "wx/private/socket.h" #include "wx/private/socket.h"
#include "wx/apptrait.h" #include "wx/apptrait.h"
#include "wx/thread.h" #include "wx/thread.h"
#include "wx/dynlib.h"
extern "C" WXDLLIMPEXP_BASE HINSTANCE wxGetInstance(); extern "C" WXDLLIMPEXP_BASE HINSTANCE wxGetInstance();
#define INSTANCE wxGetInstance() #define INSTANCE wxGetInstance()
#include <winsock.h>
#ifdef __WXWINCE__ #ifdef __WXWINCE__
/* /*
* As WSAAsyncSelect is not present on WinCE, it now uses WSACreateEvent, * As WSAAsyncSelect is not present on WinCE, it now uses WSACreateEvent,
@@ -77,7 +76,7 @@ wxCreateHiddenWindow(LPCTSTR *pclassname, LPCTSTR classname, WNDPROC wndproc);
#endif #endif
#ifndef __WXWINCE__ #ifndef __WXWINCE__
typedef int (PASCAL *WSAAsyncSelectFunc)(SOCKET,HWND,u_int,long); typedef int (PASCAL *WSAAsyncSelect_t)(SOCKET,HWND,u_int,long);
#else #else
/* Typedef the needed function prototypes and the WSANETWORKEVENTS structure /* Typedef the needed function prototypes and the WSANETWORKEVENTS structure
*/ */
@@ -85,10 +84,10 @@ typedef struct _WSANETWORKEVENTS {
long lNetworkEvents; long lNetworkEvents;
int iErrorCode[10]; int iErrorCode[10];
} WSANETWORKEVENTS, FAR * LPWSANETWORKEVENTS; } WSANETWORKEVENTS, FAR * LPWSANETWORKEVENTS;
typedef HANDLE (PASCAL *WSACreateEventFunc)(); typedef HANDLE (PASCAL *WSACreateEvent_t)();
typedef int (PASCAL *WSAEventSelectFunc)(SOCKET,HANDLE,long); typedef int (PASCAL *WSAEventSelect_t)(SOCKET,HANDLE,long);
typedef int (PASCAL *WSAWaitForMultipleEventsFunc)(long,HANDLE,BOOL,long,BOOL); typedef int (PASCAL *WSAWaitForMultipleEvents_t)(long,HANDLE,BOOL,long,BOOL);
typedef int (PASCAL *WSAEnumNetworkEventsFunc)(SOCKET,HANDLE,LPWSANETWORKEVENTS); typedef int (PASCAL *WSAEnumNetworkEvents_t)(SOCKET,HANDLE,LPWSANETWORKEVENTS);
#endif //__WXWINCE__ #endif //__WXWINCE__
LRESULT CALLBACK wxSocket_Internal_WinProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK wxSocket_Internal_WinProc(HWND, UINT, WPARAM, LPARAM);
@@ -101,15 +100,15 @@ static wxSocketImplMSW *socketList[MAXSOCKETS];
static int firstAvailable; static int firstAvailable;
#ifndef __WXWINCE__ #ifndef __WXWINCE__
static WSAAsyncSelectFunc gs_WSAAsyncSelect = NULL; static WSAAsyncSelect_t gs_WSAAsyncSelect = NULL;
#else #else
static SocketHash socketHash; static SocketHash socketHash;
static unsigned int currSocket; static unsigned int currSocket;
HANDLE hThread[MAXSOCKETS]; HANDLE hThread[MAXSOCKETS];
static WSACreateEventFunc gs_WSACreateEvent = NULL; static WSACreateEvent_t gs_WSACreateEvent = NULL;
static WSAEventSelectFunc gs_WSAEventSelect = NULL; static WSAEventSelect_t gs_WSAEventSelect = NULL;
static WSAWaitForMultipleEventsFunc gs_WSAWaitForMultipleEvents = NULL; static WSAWaitForMultipleEvents_t gs_WSAWaitForMultipleEvents = NULL;
static WSAEnumNetworkEventsFunc gs_WSAEnumNetworkEvents = NULL; static WSAEnumNetworkEvents_t gs_WSAEnumNetworkEvents = NULL;
/* This structure will be used to pass data on to the thread that handles socket events. /* This structure will be used to pass data on to the thread that handles socket events.
*/ */
typedef struct thread_data{ typedef struct thread_data{
@@ -120,13 +119,11 @@ typedef struct thread_data{
}thread_data; }thread_data;
#endif #endif
static HMODULE gs_wsock32dll = 0;
#ifdef __WXWINCE__ #ifdef __WXWINCE__
/* This thread handles socket events on WinCE using WSAEventSelect() as WSAAsyncSelect is not supported. /* This thread handles socket events on WinCE using WSAEventSelect() as
* When an event occures for the socket, it is checked what kind of event happend and the correct message gets posted * WSAAsyncSelect is not supported. When an event occurs for the socket, it is
* so that the hidden window can handle it as it would in other MSW builds. * checked what kind of event happend and the correct message gets posted so
* that the hidden window can handle it as it would in other MSW builds.
*/ */
DWORD WINAPI SocketThread(LPVOID data) DWORD WINAPI SocketThread(LPVOID data)
{ {
@@ -186,8 +183,13 @@ public:
} }
virtual void Install_Callback(wxSocketImpl *socket, wxSocketNotify event); virtual void Install_Callback(wxSocketImpl *socket, wxSocketNotify event);
virtual void Uninstall_Callback(wxSocketImpl *socket, wxSocketNotify event); virtual void Uninstall_Callback(wxSocketImpl *socket, wxSocketNotify event);
private:
static wxDynamicLibrary gs_wsock32dll;
}; };
wxDynamicLibrary wxSocketMSWManager::gs_wsock32dll;
bool wxSocketMSWManager::OnInit() bool wxSocketMSWManager::OnInit()
{ {
static LPCTSTR pclassname = NULL; static LPCTSTR pclassname = NULL;
@@ -205,46 +207,43 @@ bool wxSocketMSWManager::OnInit()
} }
firstAvailable = 0; firstAvailable = 0;
/* Load WSAAsyncSelect from wsock32.dll (we don't link against it // we don't link with wsock32.dll (or ws2 in CE case) statically to avoid
statically to avoid dependency on wsock32.dll for apps that don't use // dependencies on it for all the application using wx even if they don't use
sockets): */ // sockets
#ifndef __WXWINCE__ #ifdef __WXWINCE__
gs_wsock32dll = LoadLibrary(wxT("wsock32.dll")); #define WINSOCK_DLL_NAME _T("ws2.dll")
if (!gs_wsock32dll)
return false;
gs_WSAAsyncSelect =(WSAAsyncSelectFunc)GetProcAddress(gs_wsock32dll,
"WSAAsyncSelect");
if (!gs_WSAAsyncSelect)
return false;
#else #else
/* On WinCE we load ws2.dll which will provide the needed functions. #define WINSOCK_DLL_NAME _T("wsock32.dll")
*/
gs_wsock32dll = LoadLibrary(wxT("ws2.dll"));
if (!gs_wsock32dll)
return false;
gs_WSAEventSelect =(WSAEventSelectFunc)GetProcAddress(gs_wsock32dll,
wxT("WSAEventSelect"));
if (!gs_WSAEventSelect)
return false;
gs_WSACreateEvent =(WSACreateEventFunc)GetProcAddress(gs_wsock32dll,
wxT("WSACreateEvent"));
if (!gs_WSACreateEvent)
return false;
gs_WSAWaitForMultipleEvents =(WSAWaitForMultipleEventsFunc)GetProcAddress(gs_wsock32dll,
wxT("WSAWaitForMultipleEvents"));
if (!gs_WSAWaitForMultipleEvents)
return false;
gs_WSAEnumNetworkEvents =(WSAEnumNetworkEventsFunc)GetProcAddress(gs_wsock32dll,
wxT("WSAEnumNetworkEvents"));
if (!gs_WSAEnumNetworkEvents)
return false;
currSocket = 0;
#endif #endif
gs_wsock32dll.Load(WINSOCK_DLL_NAME, wxDL_VERBATIM | wxDL_QUIET);
if ( !gs_wsock32dll.IsLoaded() )
return false;
#ifndef __WXWINCE__
wxDL_INIT_FUNC(gs_, WSAAsyncSelect, gs_wsock32dll);
if ( !gs_WSAAsyncSelect )
return false;
#else
wxDL_INIT_FUNC(gs_, WSAEventSelect, gs_wsock32dll);
if ( !gs_WSAEventSelect )
return false;
wxDL_INIT_FUNC(gs_, WSACreateEvent, gs_wsock32dll);
if ( !gs_WSACreateEvent )
return false;
wxDL_INIT_FUNC(gs_, WSAWaitForMultipleEvents, gs_wsock32dll);
if ( !gs_WSAWaitForMultipleEvents )
return false;
wxDL_INIT_FUNC(gs_, WSAEnumNetworkEvents, gs_wsock32dll);
if ( !gs_WSAEnumNetworkEvents )
return false;
currSocket = 0;
#endif // !__WXWINCE__/__WXWINCE__
// finally initialize WinSock // finally initialize WinSock
WSADATA wsaData; WSADATA wsaData;
return WSAStartup((1 << 8) | 1, &wsaData) == 0; return WSAStartup((1 << 8) | 1, &wsaData) == 0;
@@ -261,14 +260,9 @@ void wxSocketMSWManager::OnExit()
DestroyWindow(hWin); DestroyWindow(hWin);
UnregisterClass(CLASSNAME, INSTANCE); UnregisterClass(CLASSNAME, INSTANCE);
/* Unlock wsock32.dll */
if (gs_wsock32dll)
{
FreeLibrary(gs_wsock32dll);
gs_wsock32dll = 0;
}
WSACleanup(); WSACleanup();
gs_wsock32dll.Unload();
} }
/* Per-socket GUI initialization / cleanup */ /* Per-socket GUI initialization / cleanup */