extern "C" WXDLLIMPEXP_BASE HINSTANCE wxGetInstance(void);
#define INSTANCE wxGetInstance()
-#else
+#else /* __GSOCKET_STANDALONE__ */
#include "gsockmsw.h"
#include "gsocket.h"
* be available and it must contain the app's instance
* handle.
*/
- extern HINSTANCE hInst;
+extern HINSTANCE hInst;
#define INSTANCE hInst
-#endif /* __GSOCKET_STANDALONE__ */
+#endif /* !__GSOCKET_STANDALONE__/__GSOCKET_STANDALONE__ */
#ifndef __WXWINCE__
#include <assert.h>
#define assert(x)
#include <winsock.h>
#include "wx/msw/wince/net.h"
+#include <wx/hashmap.h>
+WX_DECLARE_HASH_MAP(int,bool,wxIntegerHash,wxIntegerEqual,SocketHash);
#endif
#include <string.h>
/* Global variables */
-extern HINSTANCE INSTANCE;
static HWND hWin;
static CRITICAL_SECTION critical;
static GSocket* socketList[MAXSOCKETS];
#ifndef __WXWINCE__
static WSAAsyncSelectFunc gs_WSAAsyncSelect = NULL;
#else
-/* Setup WinCE specific stuff
-*/
-static socket_running;
+static SocketHash socketHash;
static unsigned int currSocket;
HANDLE hThread[MAXSOCKETS];
static WSACreateEventFunc gs_WSACreateEvent = NULL;
HANDLE NetworkEvent = gs_WSACreateEvent();
gs_WSAEventSelect(d->fd, NetworkEvent, d->lEvent);
- while(socket_running)
+ while(socketHash[d->fd] == true)
{
if ((gs_WSAWaitForMultipleEvents(1, &NetworkEvent, FALSE,INFINITE, FALSE)) == WAIT_FAILED)
{
printf("WSAEnumNetworkEvents failed with error %d\n", WSAGetLastError());
return 0;
}
-
+
long flags = NetworkEvents.lNetworkEvents;
if (flags & FD_READ)
::PostMessage(d->hEvtWin, d->msgnumber,d->fd, FD_READ);
::PostMessage(d->hEvtWin, d->msgnumber,d->fd, FD_CONNECT);
if (flags & FD_CLOSE)
::PostMessage(d->hEvtWin, d->msgnumber,d->fd, FD_CLOSE);
-
+
}
gs_WSAEventSelect(d->fd, NetworkEvent, 0);
ExitThread(0);
bool GSocketGUIFunctionsTableConcrete::CanUseEventLoop()
-{ return true; }
+{
+ return true;
+}
/* Global initializers */
if (!gs_wsock32dll)
return false;
gs_WSAAsyncSelect =(WSAAsyncSelectFunc)GetProcAddress(gs_wsock32dll,
- wxT("WSAAsyncSelect"));
+ "WSAAsyncSelect");
if (!gs_WSAAsyncSelect)
return false;
#else
void GSocketGUIFunctionsTableConcrete::OnExit()
{
#ifdef __WXWINCE__
-/* Delete the threads here */
+/* Delete the threads here */
for(unsigned int i=0; i < currSocket; i++)
CloseHandle(hThread[i]);
#endif
#else
/*
* WinCE creates a thread for socket event handling.
-* All needed parameters get passed through the thread_data structure.
+* All needed parameters get passed through the thread_data structure.
*/
- socket_running = true;
+
thread_data* d = new thread_data;
d->lEvent = lEvent;
d->hEvtWin = hWin;
d->msgnumber = socket->m_msgnumber;
d->fd = socket->m_fd;
+ socketHash[socket->m_fd] = true;
hThread[currSocket++] = CreateThread(NULL, 0, &SocketThread,(LPVOID)d, 0, NULL);
#endif
}
gs_WSAAsyncSelect(socket->m_fd, hWin, socket->m_msgnumber, 0);
#else
//Destroy the thread
- //TODO: This needs to be changed, maybe using another global event that could be triggered.
- socket_running = false;
+ socketHash[socket->m_fd] = false;
#endif
}
}