diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2009-11-25 00:19:45 +0000 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2009-11-25 00:19:45 +0000 | 
| commit | 0ac1a37573f966d7a03b85816c583bd6976c402f (patch) | |
| tree | 6f51a2f478b701e75244805440467b32aca40620 | |
| parent | 45a19e543cc567981df92b62f428e0f89f94cb74 (diff) | |
Added enough code to handle one class of queries (action-based), enough
to make the "Please accept this SSL certificate" question work.
Need to extend the BitlBee API a bit to *really* support this well though
(yes/no is not enough).
| -rw-r--r-- | protocols/purple/purple.c | 90 | 
1 files changed, 86 insertions, 4 deletions
| diff --git a/protocols/purple/purple.c b/protocols/purple/purple.c index f7b859ff..33b19a67 100644 --- a/protocols/purple/purple.c +++ b/protocols/purple/purple.c @@ -23,11 +23,18 @@  #include "bitlbee.h" +#include <stdarg.h> +  #include <glib.h>  #include <purple.h>  GSList *purple_connections; +/* This makes me VERY sad... :-( But some libpurple callbacks come in without +   any context so this is the only way to get that. Don't want to support +   libpurple in daemon mode anyway. */ +static irc_t *local_irc; +  static struct im_connection *purple_ic_by_pa( PurpleAccount *pa )  {  	GSList *i; @@ -133,15 +140,15 @@ static void purple_sync_settings( account_t *acc, PurpleAccount *pa )  static void purple_login( account_t *acc )  {  	struct im_connection *ic = imcb_new( acc ); -	static void *irc_check = NULL;  	PurpleAccount *pa; -	if( irc_check != NULL && irc_check != acc->irc ) +	if( local_irc != NULL && local_irc != acc->irc )  	{ -		irc_usermsg( acc->irc, "Daemon mode detected. Do *not* try to use libpurple in daemon mode! Please use inetd or ForkDaemon mode instead." ); +		irc_usermsg( acc->irc, "Daemon mode detected. Do *not* try to use libpurple in daemon mode! " +		                       "Please use inetd or ForkDaemon mode instead." );  		return;  	} -	irc_check = acc->irc; +	local_irc = acc->irc;  	/* For now this is needed in the _connected() handlers if using  	   GLib event handling, to make sure we're not handling events @@ -406,6 +413,80 @@ static PurpleConversationUiOps bee_conv_uiops =  	NULL,                      /* send_confirm         */  }; +struct prplcb_request_action_data +{ +	void *user_data, *bee_data; +	PurpleRequestActionCb yes, no; +	int yes_i, no_i; +}; + +static void prplcb_request_action_yes( void *data ) +{ +	struct prplcb_request_action_data *pqad = data; +	 +	pqad->yes( pqad->user_data, pqad->yes_i ); +	g_free( pqad ); +} + +static void prplcb_request_action_no( void *data ) +{ +	struct prplcb_request_action_data *pqad = data; +	 +	pqad->no( pqad->user_data, pqad->no_i ); +	g_free( pqad ); +} + +static void *prplcb_request_action( const char *title, const char *primary, const char *secondary, +                                    int default_action, PurpleAccount *account, const char *who, +                                    PurpleConversation *conv, void *user_data, size_t action_count, +                                    va_list actions ) +{ +	struct prplcb_request_action_data *pqad;  +	int i; +	char *q; +	 +	pqad = g_new0( struct prplcb_request_action_data, 1 ); +	 +	for( i = 0; i < action_count; i ++ ) +	{ +		char *caption; +		void *fn; +		 +		caption = va_arg( actions, char* ); +		fn = va_arg( actions, void* ); +		 +		if( strcmp( caption, "Accept" ) == 0 ) +		{ +			pqad->yes = fn; +			pqad->yes_i = i; +		} +		else if( strcmp( caption, "Reject" ) == 0 ) +		{ +			pqad->no = fn; +			pqad->no_i = i; +		} +	} +	 +	pqad->user_data = user_data; +	 +	q = g_strdup_printf( "Request: %s\n\n%s\n\n%s", title, primary, secondary ); +	pqad->bee_data = query_add( local_irc, purple_ic_by_pa( account ), q, +		prplcb_request_action_yes, prplcb_request_action_no, pqad ); +	 +	g_free( q ); +} + +static PurpleRequestUiOps bee_request_uiops = +{ +	NULL, +	NULL, +	prplcb_request_action, +	NULL, +	NULL, +	NULL, +	NULL, +}; +  static void prplcb_debug_print( PurpleDebugLevel level, const char *category, const char *arg_s )  {  	fprintf( stderr, "DEBUG %s: %s", category, arg_s ); @@ -445,6 +526,7 @@ static void purple_ui_init()  	purple_blist_set_ui_ops( &bee_blist_uiops );  	purple_connections_set_ui_ops( &bee_conn_uiops );  	purple_conversations_set_ui_ops( &bee_conv_uiops ); +	purple_request_set_ui_ops( &bee_request_uiops );  	//purple_debug_set_ui_ops( &bee_debug_uiops );  } | 
