-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 ((!m_cbkon) || (old_needed_req != flags))
- SetupCallbacks();
-}
-
-void wxSocketBase::SetupCallbacks()
-{
- if (m_fd == INVALID_SOCKET || !m_handler || (m_flags & SPEED))
- return;
-
-#if defined(__WXMOTIF__) || defined(__WXXT__) || defined(__WXGTK__)
- if (m_cbkon)
- DestroyCallbacks();
- if (m_neededreq & (REQ_ACCEPT | REQ_READ | REQ_LOST)) {
-#ifdef __WXGTK__
- m_internal->sock_inputid = gdk_input_add(m_fd, GDK_INPUT_READ,
- wx_socket_read, (gpointer)this);
-#else
- m_internal->sock_inputid = XtAppAddInput (wxAPP_CONTEXT, m_fd,
- (XtPointer *) XtInputReadMask,
- (XtInputCallbackProc) wx_socket_read,
- (XtPointer) this);
-#endif
- }
- if (m_neededreq & (REQ_CONNECT | REQ_WRITE)) {
-#ifdef __WXGTK__
- m_internal->sock_outputid = gdk_input_add(m_fd, GDK_INPUT_WRITE,
- wx_socket_write, (gpointer)this);
-#else
- m_internal->sock_outputid = XtAppAddInput (wxAPP_CONTEXT, m_fd,
- (XtPointer *) XtInputWriteMask,
- (XtInputCallbackProc) wx_socket_write,
- (XtPointer) this);
-#endif
- }
-#endif
-#ifdef __WINDOWS__
- 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
- 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
-}
-
-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(); // I disable it to prevent infinite loop on X11.
-#endif
- }
- return;
- }
-
- if (req_evt == EVT_LOST)
- {
- m_connected = FALSE;
- Close();
- }
- if (m_notifyme)
- OldOnNotify(req_evt);
-
- // Unmask
- SetNotify(m_neededreq | req_notif);
-}
-
-wxSocketEvent::wxSocketEvent(int id)
- : wxEvent(id)
-{
- wxEventType type = (wxEventType)wxEVT_SOCKET;
-
- SetEventType(type);
-}
-
-void wxSocketBase::OldOnNotify(wxRequestEvent evt)
-{
- wxSocketEvent event(m_id);
-
- event.SetEventObject(this);
- event.m_skevt = evt;
- ProcessEvent(event);
-
- if (m_cbk)
- m_cbk(*this, evt, m_cdata);
-}
-
-// --------------------------------------------------------------
-// --------- wxSocketBase functions [Callback, CallbackData] ----
-// --------------------------------------------------------------
-
-wxSocketBase::wxSockCbk wxSocketBase::Callback(wxSocketBase::wxSockCbk _cbk)
-{
- wxSockCbk old_cbk = m_cbk;
-
- m_cbk = _cbk;
- return old_cbk;
-}
-
-char *wxSocketBase::CallbackData(char *cdata_)
-{
- char *old_cdata = m_cdata;
-
- m_cdata = cdata_;
- return old_cdata;
-}
-
-void wxSocketBase::SetEventHandler(wxEvtHandler& h_evt, int id)