]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/unix/private/sockunix.h
use a virtual function instead of wxDynamicCast(wxMDIParentFrame) in wxFrame code...
[wxWidgets.git] / include / wx / unix / private / sockunix.h
index ac36bb315b299fa13c588e68ce3b3a4535966aa1..25310603649f7f44f8d41c435b5addec868fb81e 100644 (file)
@@ -31,17 +31,29 @@ public:
 
     virtual wxSocketError GetLastError() const;
 
-    virtual void Shutdown();
-
-    virtual int Read(void *buffer, int size);
-    virtual int Write(const void *buffer, int size);
+    virtual void ReenableEvents(wxSocketEventFlags flags)
+    {
+        // enable the notifications about input/output being available again in
+        // case they were disabled by OnRead/WriteWaiting()
+        //
+        // notice that we'd like to enable the events here only if there is
+        // nothing more left on the socket right now as otherwise we're going
+        // to get a "ready for whatever" notification immediately (well, during
+        // the next event loop iteration) and disable the event back again
+        // which is rather inefficient but unfortunately doing it like this
+        // doesn't work because the existing code (e.g. src/common/sckipc.cpp)
+        // expects to keep getting notifications about the data available from
+        // the socket even if it didn't read all the data the last time, so we
+        // absolutely have to continue generating them
+        EnableEvents(flags);
+    }
 
     // wxFDIOHandler methods
     virtual void OnReadWaiting();
     virtual void OnWriteWaiting();
     virtual void OnExceptionWaiting();
 
-    // Unix-specific functions
+    // Unix-specific functions used by wxSocketFDIOManager only
     bool HasAnyEnabledCallbacks() const { return m_enabledCallbacks != 0; }
     void EnableCallback(wxFDIODispatcherEntryFlags flag)
         { m_enabledCallbacks |= flag; }
@@ -52,12 +64,7 @@ public:
 private:
     virtual void DoClose()
     {
-        wxSocketManager * const manager = wxSocketManager::Get();
-        if ( manager )
-        {
-            manager->Uninstall_Callback(this, wxSOCKET_INPUT);
-            manager->Uninstall_Callback(this, wxSOCKET_OUTPUT);
-        }
+        DisableEvents();
 
         close(m_fd);
     }
@@ -71,26 +78,13 @@ private:
     }
 
     // enable or disable notifications for socket input/output events
-    void EnableEvents() { DoEnableEvents(true); }
-    void DisableEvents() { DoEnableEvents(false);
-    }
+    void EnableEvents(int flags = wxSOCKET_INPUT_FLAG | wxSOCKET_OUTPUT_FLAG)
+        { DoEnableEvents(flags, true); }
+    void DisableEvents(int flags = wxSOCKET_INPUT_FLAG | wxSOCKET_OUTPUT_FLAG)
+        { DoEnableEvents(flags, false); }
 
     // really enable or disable socket input/output events
-    void DoEnableEvents(bool enable);
-
-
-    // enable or disable events for the given event
-    //
-    // notice that these functions also update m_detected: EnableEvent() clears
-    // the corresponding bit in it and DisableEvent() sets it
-    void EnableEvent(wxSocketNotify event);
-    void DisableEvent(wxSocketNotify event);
-
-    int Recv_Stream(void *buffer, int size);
-    int Recv_Dgram(void *buffer, int size);
-    int Send_Stream(const void *buffer, int size);
-    int Send_Dgram(const void *buffer, int size);
-
+    void DoEnableEvents(int flags, bool enable);
 
 protected:
     // descriptors for input and output event notification channels associated
@@ -99,9 +93,6 @@ protected:
 
     // the events which are currently enabled for this socket, combination of
     // wxFDIO_INPUT and wxFDIO_OUTPUT values
-    //
-    // TODO: this overlaps with m_detected but the semantics of the latter are
-    //       very unclear so I don't dare to remove it right now
     int m_enabledCallbacks;
 
 private:
@@ -109,6 +100,11 @@ private:
     // down the socket if the event is wxSOCKET_LOST
     void OnStateChange(wxSocketNotify event);
 
+    // check if there is any input available, return 1 if yes, 0 if no or -1 on
+    // error
+    int CheckForInput();
+
+
     // give it access to our m_fds
     friend class wxSocketFDBasedManager;
 };
@@ -137,11 +133,12 @@ protected:
         switch ( event )
         {
             default:
-                wxFAIL_MSG( "unexpected socket event" );
-                // fall through
+                wxFAIL_MSG( "unknown socket event" );
+                return FD_INPUT; // we must return something
 
             case wxSOCKET_LOST:
-                // fall through
+                wxFAIL_MSG( "unexpected socket event" );
+                return FD_INPUT; // as above
 
             case wxSOCKET_INPUT:
                 return FD_INPUT;
@@ -150,7 +147,12 @@ protected:
                 return FD_OUTPUT;
 
             case wxSOCKET_CONNECTION:
-                // FIXME: explain this?
+                // for server sockets we're interested in events indicating
+                // that a new connection is pending, i.e. that accept() will
+                // succeed and this is indicated by socket becoming ready for
+                // reading, while for the other ones we're interested in the
+                // completion of non-blocking connect() which is indicated by
+                // the socket becoming ready for writing
                 return socket->IsServer() ? FD_INPUT : FD_OUTPUT;
         }
     }