+void wxSocketBase::OnRequest(wxSocketNotify notification)
+{
+ // NOTE: We duplicate some of the code in _Wait, but this doesn't
+ // hurt. It has to be here because the (GSocket) event might arrive
+ // a bit delayed, and it has to be in _Wait as well because we don't
+ // know whether the Wait functions are being used.
+
+ switch(notification)
+ {
+ case wxSOCKET_CONNECTION:
+ m_establishing = FALSE;
+ m_connected = TRUE;
+ break;
+
+ // If we are in the middle of a R/W operation, do not
+ // propagate events to users. Also, filter 'late' events
+ // which are no longer valid.
+
+ case wxSOCKET_INPUT:
+ if (m_reading || !GSocket_Select(m_socket, GSOCK_INPUT_FLAG))
+ return;
+ break;
+
+ case wxSOCKET_OUTPUT:
+ if (m_writing || !GSocket_Select(m_socket, GSOCK_OUTPUT_FLAG))
+ return;
+ break;
+
+ case wxSOCKET_LOST:
+ m_connected = FALSE;
+ m_establishing = FALSE;
+ break;
+
+ default:
+ break;
+ }
+
+ // Schedule the event
+
+ wxSocketEventFlags flag = 0;
+ switch (notification)
+ {
+ case GSOCK_INPUT: flag = GSOCK_INPUT_FLAG; break;
+ case GSOCK_OUTPUT: flag = GSOCK_OUTPUT_FLAG; break;
+ case GSOCK_CONNECTION: flag = GSOCK_CONNECTION_FLAG; break;
+ case GSOCK_LOST: flag = GSOCK_LOST_FLAG; break;
+ default:
+ wxLogWarning(_("wxSocket: unknown event!."));
+ return;
+ }
+
+ if (((m_eventmask & flag) == flag) && m_notify)
+ {
+ if (m_handler)
+ {
+ wxSocketEvent event(m_id);
+ event.m_event = notification;
+ event.m_clientData = m_clientData;
+ event.SetEventObject(this);
+
+ m_handler->AddPendingEvent(event);
+ }