diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2006-05-13 12:29:53 +0200 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2006-05-13 12:29:53 +0200 | 
| commit | fc2ee0f84c1746cb17c448ee75c4206dca548325 (patch) | |
| tree | c9067ffbdbf83505e0cb78863ea16a732a271887 /protocols | |
| parent | b642f38161474516c8e9fda1a9942d45a4ea9f22 (diff) | |
It works, it works! \o/
Diffstat (limited to 'protocols')
| -rw-r--r-- | protocols/Makefile | 1 | ||||
| -rw-r--r-- | protocols/events.h | 2 | ||||
| -rw-r--r-- | protocols/events_glib.c | 21 | ||||
| -rw-r--r-- | protocols/events_libevent.c | 9 | 
4 files changed, 29 insertions, 4 deletions
| diff --git a/protocols/Makefile b/protocols/Makefile index aad1ecfe..4f61d6e4 100644 --- a/protocols/Makefile +++ b/protocols/Makefile @@ -10,6 +10,7 @@  # [SH] Program variables  objects = events_libevent.o http_client.o md5.o nogaim.o proxy.o sha.o $(SSL_CLIENT) +#objects = events_glib.o http_client.o md5.o nogaim.o proxy.o sha.o $(SSL_CLIENT)  # [SH] The next two lines should contain the directory name (in $(subdirs))  #      and the name of the object file, which should be linked into diff --git a/protocols/events.h b/protocols/events.h index e8ac5a17..dcd45abe 100644 --- a/protocols/events.h +++ b/protocols/events.h @@ -48,6 +48,8 @@ typedef gboolean (*b_event_handler)(gpointer data, gint fd, b_input_condition co  #define GAIM_WRITE_COND (G_IO_OUT | G_IO_HUP | G_IO_ERR | G_IO_NVAL)  #define GAIM_ERR_COND   (G_IO_HUP | G_IO_ERR | G_IO_NVAL) +#define event_debug( x... ) printf( x ) +  G_MODULE_EXPORT void b_main_init();  G_MODULE_EXPORT void b_main_run();  G_MODULE_EXPORT void b_main_quit(); diff --git a/protocols/events_glib.c b/protocols/events_glib.c index 5a72b13c..01265fd8 100644 --- a/protocols/events_glib.c +++ b/protocols/events_glib.c @@ -72,17 +72,26 @@ static gboolean gaim_io_invoke(GIOChannel *source, GIOCondition condition, gpoin  {  	GaimIOClosure *closure = data;  	b_input_condition gaim_cond = 0; +	gboolean st;  	if (condition & GAIM_READ_COND)  		gaim_cond |= GAIM_INPUT_READ;  	if (condition & GAIM_WRITE_COND)  		gaim_cond |= GAIM_INPUT_WRITE; +	 +	event_debug( "gaim_io_invoke( %d, %d, 0x%x )\n", g_io_channel_unix_get_fd(source), condition, data ); -	return closure->function(closure->data, g_io_channel_unix_get_fd(source), gaim_cond); +	st = closure->function(closure->data, g_io_channel_unix_get_fd(source), gaim_cond); +	 +	if( !st ) +		event_debug( "Returned FALSE, cancelling.\n" ); +	 +	return st;  }  static void gaim_io_destroy(gpointer data)  { +	event_debug( "gaim_io_destroy( 0x%x )\n", data );  	g_free(data);  } @@ -104,17 +113,25 @@ gint b_input_add(gint source, b_input_condition condition, b_event_handler funct  	closure->result = g_io_add_watch_full(channel, G_PRIORITY_DEFAULT, cond,  					      gaim_io_invoke, closure, gaim_io_destroy); +	event_debug( "b_input_add( %d, %d, 0x%x, 0x%x ) = %d (0x%x)\n", source, condition, function, data, closure->result, closure ); +	  	g_io_channel_unref(channel);  	return closure->result;  }  gint b_timeout_add(gint timeout, b_event_handler func, gpointer data)  { -	return g_timeout_add(timeout, func, data); +	gint st = g_timeout_add(timeout, func, data); +	 +	event_debug( "b_timeout_add( %d, %d, %d ) = %d\n", timeout, func, data, st ); +	 +	return st;  }  void b_event_remove(gint tag)  { +	event_debug( "g_source_remove( %d )\n", tag ); +	  	if (tag > 0)  		g_source_remove(tag);  } diff --git a/protocols/events_libevent.c b/protocols/events_libevent.c index b9464093..bcfb3b45 100644 --- a/protocols/events_libevent.c +++ b/protocols/events_libevent.c @@ -71,6 +71,7 @@ static void b_event_passthrough( int fd, short event, void *data )  {  	struct b_event_data *b_ev = data;  	b_input_condition cond = 0; +	int id;  	if( fd >= 0 )  	{ @@ -82,10 +83,14 @@ static void b_event_passthrough( int fd, short event, void *data )  	event_debug( "b_event_passthrough( %d, %d, 0x%x ) (%d)\n", fd, event, (int) data, b_ev->id ); +	/* Since the called function might cancel this handler already +	   (which free()s b_ev, we have to remember the ID here. */ +	id = b_ev->id; +	  	if( !b_ev->function( b_ev->data, fd, cond ) )  	{  		event_debug( "Handler returned FALSE: " ); -		b_event_remove( b_ev->id ); +		b_event_remove( id );  	}  } @@ -150,7 +155,7 @@ void b_event_remove( gint id )  	}  	else  	{ -		event_debug( "Invalid?\n" ); +		event_debug( "Double remove?\n" );  	}  } | 
