diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2007-02-18 17:48:04 +0000 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2007-02-18 17:48:04 +0000 | 
| commit | 0fd8559c4a6ad84ad0852e07c4ba2e50b2fdf0ad (patch) | |
| tree | 6a1c98dae9b34dc4709274067d3bc7977d43ad32 /protocols/jabber/message.c | |
| parent | 8de63c3fdfb532e85f7d93778e63032f7c84b631 (diff) | |
| parent | c7d0f415e0bed09decce7a0503dce2274c9d94d9 (diff) | |
Merging new Jabber module. See the massive changelog for all the cool
improvements. :-)
Diffstat (limited to 'protocols/jabber/message.c')
| -rw-r--r-- | protocols/jabber/message.c | 105 | 
1 files changed, 105 insertions, 0 deletions
| diff --git a/protocols/jabber/message.c b/protocols/jabber/message.c new file mode 100644 index 00000000..ac72f661 --- /dev/null +++ b/protocols/jabber/message.c @@ -0,0 +1,105 @@ +/***************************************************************************\ +*                                                                           * +*  BitlBee - An IRC to IM gateway                                           * +*  Jabber module - Handling of message(s) (tags), etc                       * +*                                                                           * +*  Copyright 2006 Wilmer van der Gaast <wilmer@gaast.net>                   * +*                                                                           * +*  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 along  * +*  with this program; if not, write to the Free Software Foundation, Inc.,  * +*  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.              * +*                                                                           * +\***************************************************************************/ + +#include "jabber.h" + +xt_status jabber_pkt_message( struct xt_node *node, gpointer data ) +{ +	struct gaim_connection *gc = data; +	char *from = xt_find_attr( node, "from" ); +	char *type = xt_find_attr( node, "type" ); +	struct xt_node *body = xt_find_node( node->children, "body" ), *c; +	char *s; +	 +	if( type && strcmp( type, "error" ) == 0 ) +	{ +		/* Handle type=error packet. */ +	} +	else if( type && strcmp( type, "groupchat" ) == 0 ) +	{ +		/* TODO! */ +	} +	else /* "chat", "normal", "headline", no-type or whatever. Should all be pretty similar. */ +	{ +		struct jabber_buddy *bud = NULL; +		GString *fullmsg = g_string_new( "" ); +		 +		if( ( s = strchr( from, '/' ) ) ) +		{ +			if( ( bud = jabber_buddy_by_jid( gc, from, GET_BUDDY_EXACT ) ) ) +				bud->last_act = time( NULL ); +			else +				*s = 0; /* We need to generate a bare JID now. */ +		} +		 +		if( type && strcmp( type, "headline" ) == 0 ) +		{ +			c = xt_find_node( node->children, "subject" ); +			g_string_append_printf( fullmsg, "Headline: %s\n", c && c->text_len > 0 ? c->text : "" ); +			 +			/* <x xmlns="jabber:x:oob"><url>http://....</url></x> can contain a URL, it seems. */ +			for( c = node->children; c; c = c->next ) +			{ +				struct xt_node *url; +				 +				if( ( url = xt_find_node( c->children, "url" ) ) && url->text_len > 0 ) +					g_string_append_printf( fullmsg, "URL: %s\n", url->text ); +			} +		} +		else if( ( c = xt_find_node( node->children, "subject" ) ) && c->text_len > 0 ) +		{ +			g_string_append_printf( fullmsg, "<< \002BitlBee\002 - Message with subject: %s >>\n", c->text ); +		} +		 +		if( body && body->text_len > 0 ) /* Could be just a typing notification. */ +			fullmsg = g_string_append( fullmsg, body->text ); +		 +		if( fullmsg->len > 0 ) +			serv_got_im( gc, bud ? bud->bare_jid : from, fullmsg->str, 0, 0, fullmsg->len ); +		 +		g_string_free( fullmsg, TRUE ); +		 +		/* Handling of incoming typing notifications. */ +		if( xt_find_node( node->children, "composing" ) ) +		{ +			bud->flags |= JBFLAG_DOES_XEP85; +			serv_got_typing( gc, bud ? bud->bare_jid : from, 0, 1 ); +		} +		/* No need to send a "stopped typing" signal when there's a message. */ +		else if( xt_find_node( node->children, "active" ) && ( body == NULL ) ) +		{ +			bud->flags |= JBFLAG_DOES_XEP85; +			serv_got_typing( gc, bud ? bud->bare_jid : from, 0, 0 ); +		} +		else if( xt_find_node( node->children, "paused" ) ) +		{ +			bud->flags |= JBFLAG_DOES_XEP85; +			serv_got_typing( gc, bud ? bud->bare_jid : from, 0, 2 ); +		} +		 +		if( s ) +			*s = '/'; /* And convert it back to a full JID. */ +	} +	 +	return XT_HANDLED; +} | 
