virtual wxSocketError GetLastError() const;
- 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; }
}
// 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);
-
-
- 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
// 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;
};
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;
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;
}
}