From 788a1afa9628aeaf9d69fc53f49131a4330253cf Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 15 Oct 2006 22:24:01 +0200 Subject: Proper cleanup of jabber buddy structures when removing a buddy from the list, proper checking (and handling) of events related to buddies that aren't "hashed" yet, limit checks on priorityto setting, renamed JEP85 to XEP85, support for more XEP85 states. --- protocols/jabber/message.c | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) (limited to 'protocols/jabber/message.c') diff --git a/protocols/jabber/message.c b/protocols/jabber/message.c index fea728e3..3ff1da1c 100644 --- a/protocols/jabber/message.c +++ b/protocols/jabber/message.c @@ -29,6 +29,7 @@ xt_status jabber_pkt_message( struct xt_node *node, gpointer 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" ); + char *s; if( !type ) return XT_HANDLED; /* Grmbl... FIXME */ @@ -37,7 +38,7 @@ xt_status jabber_pkt_message( struct xt_node *node, gpointer data ) { struct jabber_buddy *bud = NULL; - if( strchr( from, '/' ) == NULL ) + if( ( s = strchr( from, '/' ) ) == NULL ) { /* It just shouldn't happen. */ hide_login_progress( gc, "Received message packet from bare JID" ); @@ -45,21 +46,34 @@ xt_status jabber_pkt_message( struct xt_node *node, gpointer data ) return XT_ABORT; } - bud = jabber_buddy_by_jid( gc, from ); - bud->last_act = time( NULL ); + if( ( bud = jabber_buddy_by_jid( gc, from ) ) ) + bud->last_act = time( NULL ); + else + *s = 0; /* We need to generate a bare JID now. */ if( body ) /* Could be just a typing notification. */ - serv_got_im( gc, bud->handle, body->text, 0, 0, 0 ); + serv_got_im( gc, bud ? bud->handle : from, body->text, 0, 0, 0 ); + /* Handling of incoming typing notifications. */ if( xt_find_node( node->children, "composing" ) ) { - bud->flags |= JBFLAG_DOES_JEP85; - serv_got_typing( gc, bud->handle, 0, 1 ); + bud->flags |= JBFLAG_DOES_XEP85; + serv_got_typing( gc, bud ? bud->handle : from, 0, 1 ); } - else if( xt_find_node( node->children, "active" ) ) + /* 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_JEP85; + bud->flags |= JBFLAG_DOES_XEP85; + serv_got_typing( gc, bud ? bud->handle : from, 0, 0 ); } + else if( xt_find_node( node->children, "paused" ) ) + { + bud->flags |= JBFLAG_DOES_XEP85; + serv_got_typing( gc, bud ? bud->handle : from, 0, 2 ); + } + + if( s ) + *s = '/'; /* And convert it back to a full JID. */ } else { @@ -69,4 +83,3 @@ xt_status jabber_pkt_message( struct xt_node *node, gpointer data ) return XT_HANDLED; } - -- cgit v1.2.3