]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/sockmsw.cpp
Don't use DDEExec registry key in wxMSW wxExecute() if it's empty.
[wxWidgets.git] / src / msw / sockmsw.cpp
index 1561c69f8f131ebed414c6629b1720344e82e5f5..7bad1d450be6842776e7c988b029c0c053160a34 100644 (file)
@@ -6,8 +6,7 @@
 // Copyright:  (C) 1999-1997, Guilhem Lavaux
 //             (C) 1999-2000, Guillermo Rodriguez Garcia
 //             (C) 2008 Vadim Zeitlin
-// RCS_ID:     $Id$
-// License:    wxWindows licence
+// Licence:    wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 
@@ -30,6 +29,7 @@
 
 #include "wx/private/socket.h"
 #include "wx/msw/private.h"     // for wxGetInstance()
+#include "wx/private/fd.h"
 #include "wx/apptrait.h"
 #include "wx/thread.h"
 #include "wx/dynlib.h"
@@ -58,11 +58,9 @@ WX_DECLARE_HASH_MAP(int,bool,wxIntegerHash,wxIntegerEqual,SocketHash);
 #  pragma warning(default:4115) /* named type definition in parentheses */
 #endif
 
-#define CLASSNAME  TEXT("_wxSocket_Internal_Window_Class")
+#include "wx/msw/private/hiddenwin.h"
 
-/* implemented in utils.cpp */
-extern "C" WXDLLIMPEXP_BASE HWND
-wxCreateHiddenWindow(LPCTSTR *pclassname, LPCTSTR classname, WNDPROC wndproc);
+#define CLASSNAME  TEXT("_wxSocket_Internal_Window_Class")
 
 /* Maximum number of different wxSocket objects at a given time.
  * This value can be modified at will, but it CANNOT be greater
@@ -121,7 +119,7 @@ typedef struct thread_data{
 #ifdef __WXWINCE__
 /* This thread handles socket events on WinCE using WSAEventSelect() as
  * WSAAsyncSelect is not supported. When an event occurs for the socket, it is
- * checked what kind of event happend and the correct message gets posted so
+ * checked what kind of event happened 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)
@@ -336,9 +334,25 @@ LRESULT CALLBACK wxSocket_Internal_WinProc(HWND hWnd,
         wxASSERT_MSG( socket->m_fd == (SOCKET)wParam,
                       "mismatch between message and socket?" );
 
-        switch WSAGETSELECTEVENT(lParam)
+        switch ( WSAGETSELECTEVENT(lParam) )
         {
             case FD_READ:
+                // We may get a FD_READ notification even when there is no data
+                // to read on the socket, in particular this happens on socket
+                // creation when we seem to always get FD_CONNECT, FD_WRITE and
+                // FD_READ notifications all at once (but it doesn't happen
+                // only then). Ignore such dummy notifications.
+                {
+                    fd_set fds;
+                    timeval tv = { 0, 0 };
+
+                    wxFD_ZERO(&fds);
+                    wxFD_SET(socket->m_fd, &fds);
+
+                    if ( select(socket->m_fd + 1, &fds, NULL, NULL, &tv) != 1 )
+                        return 0;
+                }
+
                 event = wxSOCKET_INPUT;
                 break;