-Notify_value wx_sock_write_xview (Notify_client client, int fd)
-{
- wxSocketBase *sock = (wxSocketBase *)client;
-
- if (!sock->IsConnected())
- sock->OnRequest(wxSocketBase::EVT_CONNECT);
- else
- sock->OnRequest(wxSocketBase::EVT_WRITE);
-
- return (Notify_value) TRUE;
-}
-#endif
-
-wxSocketBase::wxRequestNotify wxSocketBase::EventToNotify(wxRequestEvent evt)
-{
- switch (evt)
- {
- case EVT_READ:
- return REQ_READ;
- case EVT_PEEK:
- return REQ_PEEK;
- case EVT_WRITE:
- return REQ_WRITE;
- case EVT_LOST:
- return REQ_LOST;
- case EVT_ACCEPT:
- return REQ_ACCEPT;
- case EVT_CONNECT:
- return REQ_CONNECT;
- }
- return 0;
-}
-
-void wxSocketBase::SetFlags(wxSockFlags _flags)
-{
- m_flags = _flags;
- if (_flags & SPEED)
- {
- unsigned long flag = 0;
- ioctl(m_fd, FIONBIO, &flag);
-
- // SPEED and WAITALL are antagonists.
- m_flags = (wxSockFlags)(m_flags & ~WAITALL);
-
- Notify(FALSE);
- }
- else
- {
- unsigned long flag = 1;
- ioctl(m_fd, FIONBIO, &flag);
- }
-}
-
-void wxSocketBase::SetNotify(wxRequestNotify flags)
-{
- wxRequestNotify old_needed_req = m_neededreq;
- if (flags & REQ_ACCEPT)
- {
- /* Check if server */
- if (!(GetClassInfo()->IsKindOf(CLASSINFO(wxSocketServer))))
- flags &= ~REQ_ACCEPT;
- }
- m_neededreq = flags;
-
-/*
- if (m_cbkon && old_needed_req != flags) seems to be wrong, Robert Roebling
- SetupCallbacks();
-*/
-
- if (old_needed_req != flags)
- SetupCallbacks();
-}
-
-void wxSocketBase::SetupCallbacks()
-{
- if (m_fd == INVALID_SOCKET || !m_handler || (m_flags & SPEED))
- return;
-
-#if defined(__WXMOTIF__) || defined(__WXXT__)
- if (m_neededreq & (REQ_ACCEPT | REQ_READ | REQ_LOST))
- {
- if (m_internal->sock_inputid <= 0)
- {
- m_internal->sock_inputid = XtAppAddInput (wxAPP_CONTEXT, m_fd,
- (XtPointer *) XtInputReadMask,
- (XtInputCallbackProc) wx_socket_read,
- (XtPointer) this);
- }
- }
- else
- {
- if (m_internal->sock_inputid > 0)
- {
- XtRemoveInput(m_internal->sock_inputid);
- m_internal->sock_inputid = 0;
- }
- }
-
- if (m_neededreq & (REQ_CONNECT | REQ_WRITE))
- {
- if (m_internal->sock_outputid <= 0)
- {
- m_internal->sock_outputid = XtAppAddInput (wxAPP_CONTEXT, m_fd,
- (XtPointer *) XtInputWriteMask,
- (XtInputCallbackProc) wx_socket_write,
- (XtPointer) this);
- }
- }
- else
- {
- if (m_internal->sock_outputid > 0)
- {
- XtRemoveInput(m_internal->sock_outputid);
- m_internal->sock_outputid = 0;
- }
- }
-#endif
-
-
-#ifdef __WXGTK__
- if (m_neededreq & (REQ_ACCEPT | REQ_READ | REQ_LOST))
- {
- if (m_internal->sock_inputid <= 0)
- {
- m_internal->sock_inputid = gdk_input_add(m_fd, GDK_INPUT_READ,
- wx_socket_read, (gpointer)this);
- }
- }
- else
- {
- if (m_internal->sock_inputid > 0)
- {
-/*
- gdk_input_remove(m_internal->sock_inputid);
- m_internal->sock_inputid = 0;
-*/
- }
- }
-
- if (m_neededreq & (REQ_CONNECT | REQ_WRITE))
- {
- if (m_internal->sock_outputid <= 0)
- {
- m_internal->sock_outputid = gdk_input_add(m_fd, GDK_INPUT_WRITE,
- wx_socket_write, (gpointer)this);
- }
- }
- else
- {
- if (m_internal->sock_outputid > 0)
- {
-/*
- gdk_input_remove(m_internal->sock_outputid);
- m_internal->sock_outputid = 0;
-*/
- }
- }
-#endif
-
-
-#ifdef __WXMSW__
- WORD mask = 0;
-
- if (m_neededreq & REQ_READ)
- mask |= FD_READ;
- if (m_neededreq & REQ_WRITE)
- mask |= FD_WRITE;
- if (m_neededreq & REQ_LOST)
- mask |= FD_CLOSE;
- if (m_neededreq & REQ_ACCEPT)
- mask |= FD_ACCEPT;
- if (m_neededreq & REQ_CONNECT)
- mask |= FD_CONNECT;
-
- if (!m_internal->my_msg)
- m_internal->my_msg = m_handler->NewMessage(this);
- WSAAsyncSelect(m_fd, m_handler->GetHWND(), m_internal->my_msg, mask);
-#endif
-#ifdef __WXMAC__
- short mask = 0;
-
- if (m_neededreq & REQ_READ)
- mask |= FD_READ;
- if (m_neededreq & REQ_WRITE)
- mask |= FD_WRITE;
- if (m_neededreq & REQ_LOST)
- mask |= FD_CLOSE;
- if (m_neededreq & REQ_ACCEPT)
- mask |= FD_ACCEPT;
- if (m_neededreq & REQ_CONNECT)
- mask |= FD_CONNECT;
-
- GUSISetReference( m_fd ,mask, this ) ;
- unsigned long flag = 1;
- ioctl(m_fd, FIONBIO, &flag);
-#endif
- m_cbkon = TRUE;
- m_processing = FALSE;
-}
-
-void wxSocketBase::DestroyCallbacks()
-{
- if (!m_cbkon || !m_handler)
- return;
-
- m_cbkon = FALSE;
- m_processing = FALSE;
-#if defined(__WXMOTIF__) || defined(__WXXT__)
- if (m_internal->sock_inputid > 0)
- XtRemoveInput(m_internal->sock_inputid);
- m_internal->sock_inputid = 0;
- if (m_internal->sock_outputid > 0)
- XtRemoveInput(m_internal->sock_outputid);
- m_internal->sock_outputid = 0;
-#endif
-#ifdef __WXGTK__
- if (m_internal->sock_inputid > 0)
- gdk_input_remove(m_internal->sock_inputid);
- m_internal->sock_inputid = 0;
- if (m_internal->sock_outputid > 0)
- gdk_input_remove(m_internal->sock_outputid);
- m_internal->sock_outputid = 0;
-#endif
-#ifdef __WINDOWS__
- WSAAsyncSelect(m_fd, m_handler->GetHWND(), 0, 0);
-#endif
-#ifdef __WXMAC__
- GUSISetReference( m_fd , 0 , 0 ) ;
- int bottom = wxMacNetEventsBottom ;
- while ( wxMacNetEventsTop != bottom )
- {
- // set all events that reference this socket to nil
- if ( wxMacNetEventsReferences[bottom] == (void*) this )
- wxMacNetEventsReferences[bottom] = NULL ;
- bottom++ ;
- if ( bottom == kwxMacNetEventsMax )
- bottom = 0 ;
- }
- SetFlags( m_flags ) ;
-#endif
-}
-
-void wxSocketBase::Notify(bool notify)
-{
- if (m_notifyme == notify)
- return;
- if (notify)
- SetupCallbacks();
- else
- DestroyCallbacks();
- m_notifyme = notify;
-}
-
-void wxSocketBase::OnRequest(wxRequestEvent req_evt)
-{
- wxRequestNotify req_notif = EventToNotify(req_evt);
-
- // Mask the current event
- SetNotify(m_neededreq & ~req_notif);
-
- if (req_evt <= EVT_WRITE && DoRequests(req_evt))
- return;
-
- if (m_waitflags & 0xF0)
- {
- // Wake up
- if ((m_waitflags & 0x0F) == req_evt)
- {
- m_waitflags = 0x80;
-#ifndef __WXGTK__
- DestroyCallbacks();
-#endif
- }
- return;
- }
-
- if (req_evt == EVT_LOST)
- {
- m_connected = FALSE;