// Purpose: wxSocketImpl nd related declarations
// Authors: Guilhem Lavaux, Vadim Zeitlin
// Created: April 1997
-// RCS-ID: $Id$
+// RCS-ID: $Id: socket.h 56994 2008-11-28 12:47:07Z VZ $
// Copyright: (c) 1997 Guilhem Lavaux
// (c) 2008 Vadim Zeitlin
// Licence: wxWindows licence
// named) OnRequest() method
void NotifyOnStateChange(wxSocketNotify event);
- // FIXME: making these functions virtual is a hack necessary to make the
- // wxBase library link without requiring wxNet under Unix where
- // wxSocketSelectManager (part of wxBase) uses them, they don't
- // really need to be virtual at all
- virtual void Detected_Read() { }
- virtual void Detected_Write() { }
+ // FIXME: this one probably isn't needed here at all
virtual void Notify(bool WXUNUSED(notify)) { }
// TODO: make these fields protected and provide accessors for those of
+++ /dev/null
-/////////////////////////////////////////////////////////////////////////////
-// Name: wx/private/gsocketiohandler.h
-// Purpose: class for registering sockets with wxSelectDispatcher
-// Authors: Lukasz Michalski
-// Created: December 2006
-// Copyright: (c) Lukasz Michalski
-// RCS-ID: $Id$
-// Licence: wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
-
-#ifndef _WX_PRIVATE_GSOCKETIOHANDLER_H_
-#define _WX_PRIVATE_GSOCKETIOHANDLER_H_
-
-#include "wx/defs.h"
-
-#if wxUSE_SOCKETS && wxUSE_SELECT_DISPATCHER
-
-#include "wx/private/selectdispatcher.h"
-#include "wx/private/socket.h"
-
-class WXDLLIMPEXP_BASE wxSocketIOHandler : public wxFDIOHandler
-{
-public:
- wxSocketIOHandler(wxSocketImpl *socket)
- {
- m_socket = socket;
- m_flags = 0;
- }
-
- int GetFlags() const { return m_flags; }
- void RemoveFlag(wxFDIODispatcherEntryFlags flag) { m_flags &= ~flag; }
- void AddFlag(wxFDIODispatcherEntryFlags flag) { m_flags |= flag; }
-
- virtual void OnReadWaiting() { m_socket->Detected_Read(); }
- virtual void OnWriteWaiting() { m_socket->Detected_Write(); }
- virtual void OnExceptionWaiting() { m_socket->Detected_Read(); }
-
-private:
- wxSocketImpl *m_socket;
- int m_flags;
-};
-
-#endif // wxUSE_SOCKETS && wxUSE_SELECT_DISPATCHER
-
-#endif // _WX_PRIVATE_SOCKETEVTDISPATCH_H_
#include <unistd.h>
#include <sys/ioctl.h>
+#include "wx/private/fdiodispatcher.h"
-class wxSocketImplUnix : public wxSocketImpl
+class wxSocketImplUnix : public wxSocketImpl,
+ public wxFDIOHandler
{
public:
wxSocketImplUnix(wxSocketBase& wxsocket)
int Write(const char *buffer, int size);
//attach or detach from main loop
void Notify(bool flag);
- void Detected_Read();
- void Detected_Write();
+
+ // wxFDIOHandler methods
+ virtual void OnReadWaiting();
+ virtual void OnWriteWaiting();
+ virtual void OnExceptionWaiting();
private:
virtual wxSocketError DoHandleConnect(int ret);
}
// access the FDs we store
- int& FD(wxSocketImpl *socket, SocketDir d)
+ int& FD(wxSocketImplUnix *socket, SocketDir d)
{
- return static_cast<wxSocketImplUnix *>(socket)->m_fds[d];
+ return socket->m_fds[d];
}
};
class wxSocketInputBasedManager : public wxSocketFDBasedManager
{
public:
- virtual void Install_Callback(wxSocketImpl *socket, wxSocketNotify event)
+ virtual void Install_Callback(wxSocketImpl *socket_, wxSocketNotify event)
{
+ wxSocketImplUnix * const
+ socket = static_cast<wxSocketImplUnix *>(socket_);
+
wxCHECK_RET( socket->m_fd != -1,
"shouldn't be called on invalid socket" );
if ( fd != -1 )
RemoveInput(fd);
- fd = AddInput(socket, d);
+ fd = AddInput(socket, socket->m_fd, d);
}
- virtual void Uninstall_Callback(wxSocketImpl *socket, wxSocketNotify event)
+ virtual void Uninstall_Callback(wxSocketImpl *socket_, wxSocketNotify event)
{
+ wxSocketImplUnix * const
+ socket = static_cast<wxSocketImplUnix *>(socket_);
+
const SocketDir d = GetDirForEvent(socket, event);
int& fd = FD(socket, d);
private:
// these functions map directly to XtAdd/RemoveInput() or
// gdk_input_add/remove()
- virtual int AddInput(wxSocketImpl *socket, SocketDir d) = 0;
+ virtual int AddInput(wxFDIOHandler *handler, int fd, SocketDir d) = 0;
virtual void RemoveInput(int fd) = 0;
};
#if wxUSE_SOCKETS && wxUSE_SELECT_DISPATCHER
#include "wx/apptrait.h"
-#include "wx/unix/private.h"
-#include "wx/private/socketiohandler.h"
+#include "wx/private/socket.h"
// ============================================================================
// implementation
wxSocketImplFDIO(wxSocketBase& wxsocket)
: wxSocketImplUnix(wxsocket)
{
- m_handler = NULL;
}
- virtual ~wxSocketImplFDIO()
- {
- delete m_handler;
- }
+ int GetFlags() const { return m_flags; }
+ void RemoveFlag(wxFDIODispatcherEntryFlags flag) { m_flags &= ~flag; }
+ void AddFlag(wxFDIODispatcherEntryFlags flag) { m_flags |= flag; }
- wxSocketIOHandler *m_handler;
+private:
+ int m_flags;
};
// ----------------------------------------------------------------------------
if ( !dispatcher )
return;
- wxSocketIOHandler *& handler = socket->m_handler;
+ FD(socket, d) = fd;
- // we should register the new handlers but modify the existing ones in place
- bool registerHandler;
- if ( handler )
- {
- registerHandler = false;
- }
- else // no existing handler
- {
- registerHandler = true;
- handler = new wxSocketIOHandler(socket);
- }
+ // register it when it's used for the first time, update it if it had been
+ // previously registered
+ const bool registerHandler = socket->GetFlags() == 0;
- FD(socket, d) = fd;
- if (d == FD_INPUT)
- {
- handler->AddFlag(wxFDIO_INPUT);
- }
- else
- {
- handler->AddFlag(wxFDIO_OUTPUT);
- }
+ socket->AddFlag(d == FD_INPUT ? wxFDIO_INPUT : wxFDIO_OUTPUT);
if ( registerHandler )
- dispatcher->RegisterFD(fd, handler, handler->GetFlags());
+ dispatcher->RegisterFD(fd, socket, socket->GetFlags());
else
- dispatcher->ModifyFD(fd, handler, handler->GetFlags());
+ dispatcher->ModifyFD(fd, socket, socket->GetFlags());
}
void wxSocketSelectManager::Uninstall_Callback(wxSocketImpl *socket_,
if ( !dispatcher )
return;
- wxSocketIOHandler *& handler = socket->m_handler;
- if ( handler )
+ socket->RemoveFlag(flag);
+
+ if ( !socket->GetFlags() )
{
- handler->RemoveFlag(flag);
-
- if ( !handler->GetFlags() )
- {
- dispatcher->UnregisterFD(fd);
- delete handler;
- socket->m_handler = NULL;
- }
- else
- {
- dispatcher->ModifyFD(fd, handler, handler->GetFlags());
- }
+ dispatcher->UnregisterFD(fd);
}
else
{
- dispatcher->UnregisterFD(fd);
+ dispatcher->ModifyFD(fd, socket, socket->GetFlags());
}
}
gint WXUNUSED(source),
GdkInputCondition condition)
{
- wxSocketImpl * const socket = static_cast<wxSocketImpl *>(data);
+ wxFDIOHandler * const handler = static_cast<wxFDIOHandler *>(data);
if ( condition & GDK_INPUT_READ )
- socket->Detected_Read();
+ handler->OnReadWaiting();
if ( condition & GDK_INPUT_WRITE )
- socket->Detected_Write();
+ handler->OnWriteWaiting();
}
}
class GTKSocketManager : public wxSocketInputBasedManager
{
public:
- virtual int AddInput(wxSocketImpl *socket, SocketDir d)
+ virtual int AddInput(wxFDIOHandler *handler, int fd, SocketDir d)
{
return gdk_input_add
(
- socket->m_fd,
+ fd,
d == FD_OUTPUT ? GDK_INPUT_WRITE : GDK_INPUT_READ,
wxSocket_GDK_Input,
- socket
+ handler
);
}
gint WXUNUSED(source),
GdkInputCondition condition)
{
- wxSocketImpl const *socket = static_cast<wxSocketImpl *>(data);
+ wxFDIOHandler * const handler = static_cast<wxFDIOHandler *>(data);
- if ( condition & GDK_INPUT_READ )
- socket->Detected_Read();
- if ( condition & GDK_INPUT_WRITE )
- socket->Detected_Write();
+ if ( condition & GDK_INPUT_READ )
+ handler->OnReadWaiting();
+ if ( condition & GDK_INPUT_WRITE )
+ handler->OnWriteWaiting();
}
}
class GTKSocketManager : public wxSocketInputBasedManager
{
public:
- virtual int AddInput(wxSocketImpl *socket, SocketDir d)
+ virtual int AddInput(wxFDIOHandler *handler, int fd, SocketDir d)
{
return gdk_input_add
(
- socket->m_fd,
+ fd,
d == FD_OUTPUT ? GDK_INPUT_WRITE : GDK_INPUT_READ,
wxSocket_GDK_Input,
- socket
+ handler
);
}
///////////////////////////////////////////////////////////////////////////////
-// Name: motif/gsockmot.cpp
+// Name: motif/sockmot.cpp
// Purpose: implementation of wxMotif-specific socket event handling
// Author: Guilhem Lavaux, Vadim Zeitlin
// Created: 1999
static void wxSocket_Motif_Input(XtPointer data, int *WXUNUSED(fid),
XtInputId *WXUNUSED(id))
{
- wxSocketImpl * const socket = static_cast<wxSocketImpl *>(data);
+ wxFDIOHandler * const handler = static_cast<wxFDIOHandler *>(data);
- socket->Detected_Read();
+ handler->OnReadWaiting();
}
static void wxSocket_Motif_Output(XtPointer data, int *WXUNUSED(fid),
XtInputId *WXUNUSED(id))
{
- wxSocketImpl * const socket = static_cast<wxSocketImpl *>(data);
+ wxFDIOHandler * const handler = static_cast<wxFDIOHandler *>(data);
- socket->Detected_Write();
+ handler->OnWriteWaiting();
}
}
class MotifSocketManager : public wxSocketInputBasedManager
{
public:
- virtual int AddInput(wxSocketImpl *socket, SocketDir d)
+ virtual int AddInput(wxFDIOHandler *handler, int fd, SocketDir d)
{
return XtAppAddInput
(
wxGetAppContext(),
- socket->m_fd,
+ fd,
(XtPointer)(d == FD_OUTPUT ? XtInputWriteMask
: XtInputReadMask),
d == FD_OUTPUT ? wxSocket_Motif_Output
: wxSocket_Motif_Input,
- socket
+ handler
);
}
-/* -------------------------------------------------------------------------
- * Project: wxSocketImpl (Generic Socket) for WX
- * Name: gsockpm.c
- * Purpose: wxSocketImpl: PM part
- * Licence: The wxWindows licence
- * CVSID: $Id$
- * ------------------------------------------------------------------------- */
+///////////////////////////////////////////////////////////////////////////////
+// Name: os2/sockpm.cpp
+// Purpose: implementation of OS-2-specific handler event handling
+// Author: Guilhem Lavaux, Vadim Zeitlin
+// Created: 1999
+// RCS-ID: $Id$
+// Copyright: (c) 1999-2008 wxWidgets dev team
+// Licence: wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
static void wxSocket_PM_Input(void *data)
{
- wxSocketImpl *socket = static_cast<wxSocketImpl *>(data);
+ wxFDIOHandler *handler = static_cast<wxFDIOHandler *>(data);
- socket->Detected_Read();
+ handler->OnReadWaiting();
}
static void wxSocket_PM_Output(void *data)
{
- wxSocketImpl *socket = static_cast<wxSocketImpl *>(data);
+ wxFDIOHandler *handler = static_cast<wxFDIOHandler *>(data);
- socket->Detected_Write();
+ handler->OnWriteWaiting();
}
class PMSocketManager : public wxSocketInputBasedManager
{
public:
- virtual int AddInput(wxSocketImpl *socket, SocketDir d)
+ virtual int AddInput(wxFDIOHandler *handler, int fd, SocketDir d)
{
-
if (d == FD_OUTPUT)
- return wxTheApp->AddSocketHandler(socket->m_fd, wxSockWriteMask,
- wxSocket_PM_Output, (void *)socket);
+ return wxTheApp->AddSocketHandler(fd, wxSockWriteMask,
+ wxSocket_PM_Output, handler);
else
- return wxTheApp->AddSocketHandler(socket->m_fd, wxSockReadMask,
- wxSocket_PM_Input, (void *)socket);
+ return wxTheApp->AddSocketHandler(fd, wxSockReadMask,
+ wxSocket_PM_Input, handler);
}
virtual void RemoveInput(int fd)
if (m_use_events)
{
m_detected = wxSOCKET_LOST_FLAG;
- Detected_Read();
+ OnReadWaiting();
return 0;
}
}
Shutdown();
}
-void wxSocketImplUnix::Detected_Read()
+void wxSocketImplUnix::OnReadWaiting()
{
char c;
- /* Safeguard against straggling call to Detected_Read */
if (m_fd == INVALID_SOCKET)
{
return;
}
}
-void wxSocketImplUnix::Detected_Write()
+void wxSocketImplUnix::OnWriteWaiting()
{
/* If we have already detected a LOST event, then don't try
* to do any further processing.
}
}
+void wxSocketImplUnix::OnExceptionWaiting()
+{
+ wxFAIL_MSG( "not supposed to be called" );
+}
+
/*
* -------------------------------------------------------------------------
* GAddress