///////////////////////////////////////////////////////////////////////////////
-// Name: gtk/gsockgtk.cpp
+// Name: src/gtk/sockgtk.cpp
// Purpose: implementation of wxGTK-specific socket event handling
// Author: Guilhem Lavaux, Vadim Zeitlin
// Created: 1999
// RCS-ID: $Id$
// Copyright: (c) 1999, 2007 wxWidgets dev team
+// (c) 2009 Vadim Zeitlin
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#if wxUSE_SOCKETS
-#include <stdlib.h>
-#include <stdio.h>
+#include "wx/apptrait.h"
+#include "wx/private/fdiomanager.h"
-#include <gdk/gdk.h>
#include <glib.h>
-#include "wx/private/socket.h"
-#include "wx/apptrait.h"
-
extern "C" {
-static
-void wxSocket_GDK_Input(gpointer data,
- gint WXUNUSED(source),
- GdkInputCondition condition)
+static gboolean wxSocket_Input(GIOChannel*, GIOCondition condition, gpointer data)
{
- wxSocketImpl * const handler = static_cast<wxSocketImpl *>(data);
+ wxFDIOHandler * const handler = static_cast<wxFDIOHandler *>(data);
- if ( condition & GDK_INPUT_READ )
+ if (condition & G_IO_IN)
+ {
handler->OnReadWaiting();
- if ( condition & GDK_INPUT_WRITE )
+
+ // we could have lost connection while reading in which case we
+ // shouldn't call OnWriteWaiting() as the socket is now closed and it
+ // would assert
+ if ( !handler->IsOk() )
+ return true;
+ }
+
+ if (condition & G_IO_OUT)
handler->OnWriteWaiting();
+
+ return true;
}
}
-class GTKSocketManager : public wxSocketInputBasedManager
+class GTKFDIOManager : public wxFDIOManager
{
public:
- virtual int AddInput(wxSocketImpl *handler, int fd, SocketDir d)
+ virtual int AddInput(wxFDIOHandler *handler, int fd, Direction d)
{
- return gdk_input_add
- (
- fd,
- d == FD_OUTPUT ? GDK_INPUT_WRITE : GDK_INPUT_READ,
- wxSocket_GDK_Input,
- handler
- );
+ return g_io_add_watch(
+ g_io_channel_unix_new(fd),
+ d == OUTPUT ? G_IO_OUT : G_IO_IN,
+ wxSocket_Input,
+ handler);
}
- virtual void RemoveInput(int fd)
+ virtual void
+ RemoveInput(wxFDIOHandler* WXUNUSED(handler), int fd, Direction WXUNUSED(d))
{
- gdk_input_remove(fd);
+ g_source_remove(fd);
}
};
-wxSocketManager *wxGUIAppTraits::GetSocketManager()
+wxFDIOManager *wxGUIAppTraits::GetFDIOManager()
{
- static GTKSocketManager s_manager;
+ static GTKFDIOManager s_manager;
return &s_manager;
}