diff options
Diffstat (limited to 'protocols/jabber/jabber.c')
| -rw-r--r-- | protocols/jabber/jabber.c | 72 | 
1 files changed, 63 insertions, 9 deletions
| diff --git a/protocols/jabber/jabber.c b/protocols/jabber/jabber.c index 266022ba..91f88350 100644 --- a/protocols/jabber/jabber.c +++ b/protocols/jabber/jabber.c @@ -44,6 +44,8 @@ static void jabber_acc_init( account_t *acc )  	s = set_add( &acc->set, "resource", "BitlBee", NULL, acc );  	s->flags |= ACC_SET_OFFLINE_ONLY; +	s = set_add( &acc->set, "resource_select", "priority", NULL, acc ); +	  	s = set_add( &acc->set, "server", NULL, set_eval_account, acc );  	s->flags |= ACC_SET_NOSAVE | ACC_SET_OFFLINE_ONLY; @@ -136,19 +138,33 @@ static void jabber_close( struct gaim_connection *gc )  static int jabber_send_im( struct gaim_connection *gc, char *who, char *message, int len, int away )  { +	struct jabber_data *jd = gc->proto_data; +	struct jabber_buddy *bud;  	struct xt_node *node;  	int st; -	/* -	event = xt_new_node( "active", NULL, NULL ); -	xt_add_attr( event, "xlmns", "http://jabber.org/protocol/chatstates" ); -	 -	event = xt_new_node( "x", NULL, xt_new_node( "composing", NULL, NULL ) ); -	xt_add_attr( event, "xmlns", "jabber:x:event" ); -	*/ +	bud = jabber_buddy_by_jid( gc, who );  	node = xt_new_node( "body", message, NULL ); -	node = jabber_make_packet( "message", "chat", who, node ); +	node = jabber_make_packet( "message", "chat", bud->full_jid, node ); +	 +	if( ( jd->flags & JFLAG_WANT_TYPING ) && +	    ( ( bud->flags & JBFLAG_DOES_JEP85 ) || +	     !( bud->flags & JBFLAG_PROBED_JEP85 ) ) ) +	{ +		struct xt_node *act; +		 +		/* If the user likes typing notification and if we don't know +		   (and didn't probe before) if this resource supports JEP85, +		   include a probe in this packet now. */ +		act = xt_new_node( "active", NULL, NULL ); +		xt_add_attr( act, "xmlns", "http://jabber.org/protocol/chatstates" ); +		xt_add_child( node, act ); +		 +		/* Just make sure we do this only once. */ +		bud->flags |= JBFLAG_PROBED_JEP85; +	} +	  	st = jabber_write_packet( gc, node );  	xt_free_node( node ); @@ -228,6 +244,44 @@ static void jabber_keepalive( struct gaim_connection *gc )  	jabber_cache_clean( gc );  } +static int jabber_send_typing( struct gaim_connection *gc, char *who, int typing ) +{ +	struct jabber_data *jd = gc->proto_data; +	struct jabber_buddy *bud; +	 +	/* Enable typing notification related code from now. */ +	jd->flags |= JFLAG_WANT_TYPING; +	 +	bud = jabber_buddy_by_jid( gc, who ); +	if( bud->flags & JBFLAG_DOES_JEP85 ) +	{ +		/* We're only allowed to send this stuff if we know the other +		   side supports it. */ +		 +		struct xt_node *node; +		char *type; +		int st; +		 +		if( typing == 0 ) +			type = "active"; +		else if( typing == 2 ) +			type = "paused"; +		else /* if( typing == 1 ) */ +			type = "composing"; +		 +		node = xt_new_node( type, NULL, NULL ); +		xt_add_attr( node, "xmlns", "http://jabber.org/protocol/chatstates" ); +		node = jabber_make_packet( "message", "chat", bud->full_jid, node ); +		 +		st = jabber_write_packet( gc, node ); +		xt_free_node( node ); +		 +		return st; +	} +	 +	return 1; +} +  void jabber_init()  {  	struct prpl *ret = g_new0( struct prpl, 1 ); @@ -249,7 +303,7 @@ void jabber_init()  //	ret->chat_leave = jabber_chat_leave;  //	ret->chat_open = jabber_chat_open;  	ret->keepalive = jabber_keepalive; -//	ret->send_typing = jabber_send_typing; +	ret->send_typing = jabber_send_typing;  	ret->handle_cmp = g_strcasecmp;  	register_protocol( ret ); | 
