diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2006-05-09 09:20:05 +0200 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2006-05-09 09:20:05 +0200 | 
| commit | ecf8fa820aa8fa3592bdf96ed3bdeec4ec94f036 (patch) | |
| tree | e75d789c49e90ae25e8497d89c23fc353ebea06b /protocols/events_glib.c | |
| parent | a0d04d6253cf70877a11156059209e1f9a2efe31 (diff) | |
Split off event handling related functions (depending on GLib) to events_glib.c.
Diffstat (limited to 'protocols/events_glib.c')
| -rw-r--r-- | protocols/events_glib.c | 100 | 
1 files changed, 100 insertions, 0 deletions
| diff --git a/protocols/events_glib.c b/protocols/events_glib.c new file mode 100644 index 00000000..f3b27565 --- /dev/null +++ b/protocols/events_glib.c @@ -0,0 +1,100 @@ +  /********************************************************************\ +  * BitlBee -- An IRC to other IM-networks gateway                     * +  *                                                                    * +  * Copyright 2002-2006 Wilmer van der Gaast and others                * +  \********************************************************************/ + +/* + * Event handling (using GLib) + */ + +/* +  This program is free software; you can redistribute it and/or modify +  it under the terms of the GNU General Public License as published by +  the Free Software Foundation; either version 2 of the License, or +  (at your option) any later version. + +  This program is distributed in the hope that it will be useful, +  but WITHOUT ANY WARRANTY; without even the implied warranty of +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +  GNU General Public License for more details. + +  You should have received a copy of the GNU General Public License with +  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL; +  if not, write to the Free Software Foundation, Inc., 59 Temple Place, +  Suite 330, Boston, MA  02111-1307  USA +*/ + +#define BITLBEE_CORE +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#ifndef _WIN32 +#include <sys/socket.h> +#include <netdb.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <unistd.h> +#else +#include "sock.h" +#define ETIMEDOUT WSAETIMEDOUT +#define EINPROGRESS WSAEINPROGRESS +#endif +#include <fcntl.h> +#include <errno.h> +#include "proxy.h" + +typedef struct _GaimIOClosure { +	GaimInputFunction function; +	guint result; +	gpointer data; +} GaimIOClosure; + +static gboolean gaim_io_invoke(GIOChannel *source, GIOCondition condition, gpointer data) +{ +	GaimIOClosure *closure = data; +	GaimInputCondition gaim_cond = 0; + +	if (condition & GAIM_READ_COND) +		gaim_cond |= GAIM_INPUT_READ; +	if (condition & GAIM_WRITE_COND) +		gaim_cond |= GAIM_INPUT_WRITE; + +	closure->function(closure->data, g_io_channel_unix_get_fd(source), gaim_cond); + +	return TRUE; +} + +static void gaim_io_destroy(gpointer data) +{ +	g_free(data); +} + +gint gaim_input_add(gint source, GaimInputCondition condition, GaimInputFunction function, gpointer data) +{ +	GaimIOClosure *closure = g_new0(GaimIOClosure, 1); +	GIOChannel *channel; +	GIOCondition cond = 0; +	 +	closure->function = function; +	closure->data = data; +	 +	if (condition & GAIM_INPUT_READ) +		cond |= GAIM_READ_COND; +	if (condition & GAIM_INPUT_WRITE) +		cond |= GAIM_WRITE_COND; +	 +	channel = g_io_channel_unix_new(source); +	closure->result = g_io_add_watch_full(channel, G_PRIORITY_DEFAULT, cond, +					      gaim_io_invoke, closure, gaim_io_destroy); +	 +	g_io_channel_unref(channel); +	return closure->result; +} + +void gaim_input_remove(gint tag) +{ +	if (tag > 0) +		g_source_remove(tag); +} | 
