]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/gsocket.cpp
Eliminated C++ RTTI (typeid etc) use. Eliminated wxPGVariantData (default default...
[wxWidgets.git] / src / unix / gsocket.cpp
index 08dbb42dfa745a9fb5d6fb88568085a04fa2dc21..5cb9783b712bc1f521d96b6bd6fb9e911d52f498 100644 (file)
@@ -21,7 +21,6 @@
 #ifndef __GSOCKET_STANDALONE__
 #include "wx/defs.h"
 #include "wx/private/gsocketiohandler.h"
-#include "wx/thread.h" // for wxThread::IsMain() used in assert
 #endif
 
 #if defined(__VISAGECPP__)
@@ -872,10 +871,6 @@ void GSocket::Notify(bool flag)
 {
     if (flag == m_use_events)
         return;
-#if wxUSE_THREADS
-    // it is not safe to attach or detach i/o descriptor in child thread
-    wxASSERT_MSG( wxThread::IsMain(), "should be called in main thread only" );
-#endif
     m_use_events = flag;
     EnableEvents(flag);
 }
@@ -1198,11 +1193,16 @@ int GSocket::Read(char *buffer, int size)
     else
       ret = Recv_Dgram(buffer, size);
 
-    /* If recv returned zero, then the connection has been gracefully closed.
-     * Otherwise, recv has returned an error (-1), in which case we have lost the
-     * socket only if errno does _not_ indicate that there may be more data to read.
+    /*
+     * If recv returned zero for a TCP socket (if m_stream == NULL, it's an UDP
+     * socket and empty datagrams are possible), then the connection has been
+     * gracefully closed.
+     *
+     * Otherwise, recv has returned an error (-1), in which case we have lost
+     * the socket only if errno does _not_ indicate that there may be more data
+     * to read.
      */
-    if (ret == 0)
+    if ((ret == 0) && m_stream)
     {
       /* Make sure wxSOCKET_LOST event gets sent and shut down the socket */
       if (m_use_events)
@@ -1777,9 +1777,17 @@ void GSocket::Detected_Read()
     }
     else if (num == 0)
     {
-      /* graceful shutdown */
-      CALL_CALLBACK(this, GSOCK_LOST);
-      Shutdown();
+      if (m_stream)
+      {
+        /* graceful shutdown */
+        CALL_CALLBACK(this, GSOCK_LOST);
+        Shutdown();
+      }
+      else
+      {
+        /* Empty datagram received */
+        CALL_CALLBACK(this, GSOCK_INPUT);
+      }
     }
     else
     {