diff options
Diffstat (limited to 'protocols/jabber/presence.c')
-rw-r--r-- | protocols/jabber/presence.c | 251 |
1 files changed, 117 insertions, 134 deletions
diff --git a/protocols/jabber/presence.c b/protocols/jabber/presence.c index 2875d23e..82ea5f8f 100644 --- a/protocols/jabber/presence.c +++ b/protocols/jabber/presence.c @@ -23,236 +23,219 @@ #include "jabber.h" -xt_status jabber_pkt_presence( struct xt_node *node, gpointer data ) +xt_status jabber_pkt_presence(struct xt_node *node, gpointer data) { struct im_connection *ic = data; - char *from = xt_find_attr( node, "from" ); - char *type = xt_find_attr( node, "type" ); /* NULL should mean the person is online. */ + char *from = xt_find_attr(node, "from"); + char *type = xt_find_attr(node, "type"); /* NULL should mean the person is online. */ struct xt_node *c, *cap; struct jabber_buddy *bud, *send_presence = NULL; int is_chat = 0; char *s; - - if( !from ) + + if (!from) { return XT_HANDLED; - - if( ( s = strchr( from, '/' ) ) ) - { + } + + if ((s = strchr(from, '/'))) { *s = 0; - if( jabber_chat_by_jid( ic, from ) ) + if (jabber_chat_by_jid(ic, from)) { is_chat = 1; + } *s = '/'; } - - if( type == NULL ) - { - if( !( bud = jabber_buddy_by_jid( ic, from, GET_BUDDY_EXACT | GET_BUDDY_CREAT ) ) ) - { + + if (type == NULL) { + if (!(bud = jabber_buddy_by_jid(ic, from, GET_BUDDY_EXACT | GET_BUDDY_CREAT))) { /* imcb_log( ic, "Warning: Could not handle presence information from JID: %s", from ); */ return XT_HANDLED; } - - g_free( bud->away_message ); - if( ( c = xt_find_node( node->children, "status" ) ) && c->text_len > 0 ) - bud->away_message = g_strdup( c->text ); - else + + g_free(bud->away_message); + if ((c = xt_find_node(node->children, "status")) && c->text_len > 0) { + bud->away_message = g_strdup(c->text); + } else { bud->away_message = NULL; - - if( ( c = xt_find_node( node->children, "show" ) ) && c->text_len > 0 ) - { - bud->away_state = (void*) jabber_away_state_by_code( c->text ); } - else - { + + if ((c = xt_find_node(node->children, "show")) && c->text_len > 0) { + bud->away_state = (void *) jabber_away_state_by_code(c->text); + } else { bud->away_state = NULL; } - - if( ( c = xt_find_node( node->children, "priority" ) ) && c->text_len > 0 ) - bud->priority = atoi( c->text ); - else + + if ((c = xt_find_node(node->children, "priority")) && c->text_len > 0) { + bud->priority = atoi(c->text); + } else { bud->priority = 0; - - if( bud && ( cap = xt_find_node( node->children, "c" ) ) && - ( s = xt_find_attr( cap, "xmlns" ) ) && strcmp( s, XMLNS_CAPS ) == 0 ) - { + } + + if (bud && (cap = xt_find_node(node->children, "c")) && + (s = xt_find_attr(cap, "xmlns")) && strcmp(s, XMLNS_CAPS) == 0) { /* This <presence> stanza includes an XEP-0115 capabilities part. Not too interesting, but we can see if it has an ext= attribute. */ - s = xt_find_attr( cap, "ext" ); - if( s && ( strstr( s, "cstates" ) || strstr( s, "chatstate" ) ) ) + s = xt_find_attr(cap, "ext"); + if (s && (strstr(s, "cstates") || strstr(s, "chatstate"))) { bud->flags |= JBFLAG_DOES_XEP85; - + } + /* This field can contain more information like xhtml support, but we don't support that ourselves. Officially the ext= tag was deprecated, but enough clients do send it. - + (I'm aware that this is not the right way to use this field.) See for an explanation of ext=: http://www.xmpp.org/extensions/attic/xep-0115-1.3.html*/ } - - if( is_chat ) - jabber_chat_pkt_presence( ic, bud, node ); - else - send_presence = jabber_buddy_by_jid( ic, bud->bare_jid, 0 ); - } - else if( strcmp( type, "unavailable" ) == 0 ) - { - if( ( bud = jabber_buddy_by_jid( ic, from, 0 ) ) == NULL ) - { + + if (is_chat) { + jabber_chat_pkt_presence(ic, bud, node); + } else { + send_presence = jabber_buddy_by_jid(ic, bud->bare_jid, 0); + } + } else if (strcmp(type, "unavailable") == 0) { + if ((bud = jabber_buddy_by_jid(ic, from, 0)) == NULL) { /* imcb_log( ic, "Warning: Received presence information from unknown JID: %s", from ); */ return XT_HANDLED; } - + /* Handle this before we delete the JID. */ - if( is_chat ) - { - jabber_chat_pkt_presence( ic, bud, node ); + if (is_chat) { + jabber_chat_pkt_presence(ic, bud, node); } - - if( strchr( from, '/' ) == NULL ) + + if (strchr(from, '/') == NULL) { /* Sometimes servers send a type="unavailable" from a bare JID, which should mean that suddenly all resources for this JID disappeared. */ - jabber_buddy_remove_bare( ic, from ); - else - jabber_buddy_remove( ic, from ); - - if( is_chat ) - { - /* Nothing else to do for now? */ + jabber_buddy_remove_bare(ic, from); + } else { + jabber_buddy_remove(ic, from); } - else if( ( s = strchr( from, '/' ) ) ) - { + + if (is_chat) { + /* Nothing else to do for now? */ + } else if ((s = strchr(from, '/'))) { *s = 0; - + /* If another resource is still available, send its presence information. */ - if( ( send_presence = jabber_buddy_by_jid( ic, from, 0 ) ) == NULL ) - { + if ((send_presence = jabber_buddy_by_jid(ic, from, 0)) == NULL) { /* Otherwise, count him/her as offline now. */ - imcb_buddy_status( ic, from, 0, NULL, NULL ); + imcb_buddy_status(ic, from, 0, NULL, NULL); } - + *s = '/'; + } else { + imcb_buddy_status(ic, from, 0, NULL, NULL); } - else - { - imcb_buddy_status( ic, from, 0, NULL, NULL ); - } - } - else if( strcmp( type, "subscribe" ) == 0 ) - { - jabber_buddy_ask( ic, from ); - } - else if( strcmp( type, "subscribed" ) == 0 ) - { + } else if (strcmp(type, "subscribe") == 0) { + jabber_buddy_ask(ic, from); + } else if (strcmp(type, "subscribed") == 0) { /* Not sure about this one, actually... */ - imcb_log( ic, "%s just accepted your authorization request", from ); - } - else if( strcmp( type, "unsubscribe" ) == 0 || strcmp( type, "unsubscribed" ) == 0 ) - { + imcb_log(ic, "%s just accepted your authorization request", from); + } else if (strcmp(type, "unsubscribe") == 0 || strcmp(type, "unsubscribed") == 0) { /* Do nothing here. Plenty of control freaks or over-curious souls get excited when they can see who still has them in their buddy list and who finally removed them. Somehow I got the impression that those are the people who get removed from many buddy lists for "some" reason... - + If you're one of those people, this is your chance to write your first line of code in C... */ - } - else if( strcmp( type, "error" ) == 0 ) - { - return jabber_cache_handle_packet( ic, node ); - + } else if (strcmp(type, "error") == 0) { + return jabber_cache_handle_packet(ic, node); + /* struct jabber_error *err; if( ( c = xt_find_node( node->children, "error" ) ) ) { - err = jabber_error_parse( c, XMLNS_STANZA_ERROR ); - imcb_error( ic, "Stanza (%s) error: %s%s%s", node->name, - err->code, err->text ? ": " : "", - err->text ? err->text : "" ); - jabber_error_free( err ); + err = jabber_error_parse( c, XMLNS_STANZA_ERROR ); + imcb_error( ic, "Stanza (%s) error: %s%s%s", node->name, + err->code, err->text ? ": " : "", + err->text ? err->text : "" ); + jabber_error_free( err ); } */ } - if( send_presence ) - { + if (send_presence) { int is_away = 0; - if( send_presence->away_state && - strcmp( send_presence->away_state->code, "chat" ) != 0 ) + if (send_presence->away_state && + strcmp(send_presence->away_state->code, "chat") != 0) { is_away = OPT_AWAY; + } - imcb_buddy_status( ic, send_presence->bare_jid, OPT_LOGGED_IN | is_away, - is_away ? send_presence->away_state->full_name : NULL, - send_presence->away_message ); + imcb_buddy_status(ic, send_presence->bare_jid, OPT_LOGGED_IN | is_away, + is_away ? send_presence->away_state->full_name : NULL, + send_presence->away_message); } - + return XT_HANDLED; } /* Whenever presence information is updated, call this function to inform the server. */ -int presence_send_update( struct im_connection *ic ) +int presence_send_update(struct im_connection *ic) { struct jabber_data *jd = ic->proto_data; struct xt_node *node, *cap; GSList *l; int st; - - node = jabber_make_packet( "presence", NULL, NULL, NULL ); - xt_add_child( node, xt_new_node( "priority", set_getstr( &ic->acc->set, "priority" ), NULL ) ); - if( jd->away_state ) - xt_add_child( node, xt_new_node( "show", jd->away_state->code, NULL ) ); - if( jd->away_message ) - xt_add_child( node, xt_new_node( "status", jd->away_message, NULL ) ); - + + node = jabber_make_packet("presence", NULL, NULL, NULL); + xt_add_child(node, xt_new_node("priority", set_getstr(&ic->acc->set, "priority"), NULL)); + if (jd->away_state) { + xt_add_child(node, xt_new_node("show", jd->away_state->code, NULL)); + } + if (jd->away_message) { + xt_add_child(node, xt_new_node("status", jd->away_message, NULL)); + } + /* This makes the packet slightly bigger, but clients interested in capabilities can now cache the discovery info. This reduces the usual post-login iq-flood. See XEP-0115. At least libpurple and Trillian seem to do this right. */ - cap = xt_new_node( "c", NULL, NULL ); - xt_add_attr( cap, "xmlns", XMLNS_CAPS ); - xt_add_attr( cap, "node", "http://bitlbee.org/xmpp/caps" ); - xt_add_attr( cap, "ver", BITLBEE_VERSION ); /* The XEP wants this hashed, but nobody's doing that. */ - xt_add_child( node, cap ); - - st = jabber_write_packet( ic, node ); - + cap = xt_new_node("c", NULL, NULL); + xt_add_attr(cap, "xmlns", XMLNS_CAPS); + xt_add_attr(cap, "node", "http://bitlbee.org/xmpp/caps"); + xt_add_attr(cap, "ver", BITLBEE_VERSION); /* The XEP wants this hashed, but nobody's doing that. */ + xt_add_child(node, cap); + + st = jabber_write_packet(ic, node); + /* Have to send this update to all groupchats too, the server won't do this automatically. */ - for( l = ic->groupchats; l && st; l = l->next ) - { + for (l = ic->groupchats; l && st; l = l->next) { struct groupchat *c = l->data; struct jabber_chat *jc = c->data; - - xt_add_attr( node, "to", jc->my_full_jid ); - st = jabber_write_packet( ic, node ); + + xt_add_attr(node, "to", jc->my_full_jid); + st = jabber_write_packet(ic, node); } - - xt_free_node( node ); + + xt_free_node(node); return st; } /* Send a subscribe/unsubscribe request to a buddy. */ -int presence_send_request( struct im_connection *ic, char *handle, char *request ) +int presence_send_request(struct im_connection *ic, char *handle, char *request) { struct xt_node *node; int st; - - node = jabber_make_packet( "presence", NULL, NULL, NULL ); - xt_add_attr( node, "to", handle ); - xt_add_attr( node, "type", request ); - - st = jabber_write_packet( ic, node ); - - xt_free_node( node ); + + node = jabber_make_packet("presence", NULL, NULL, NULL); + xt_add_attr(node, "to", handle); + xt_add_attr(node, "type", request); + + st = jabber_write_packet(ic, node); + + xt_free_node(node); return st; } |