Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • protocols/jabber/presence.c

    r43462708 r8c1eb80  
    2929        char *from = xt_find_attr( node, "from" );
    3030        char *type = xt_find_attr( node, "type" );      /* NULL should mean the person is online. */
    31         struct xt_node *c;
    32         struct jabber_buddy *bud;
    33         int is_chat = 0, is_away = 0;
     31        struct xt_node *c, *cap;
     32        struct jabber_buddy *bud, *send_presence = NULL;
     33        int is_chat = 0;
    3434        char *s;
    3535       
     
    6363                {
    6464                        bud->away_state = (void*) jabber_away_state_by_code( c->text );
    65                         if( strcmp( c->text, "chat" ) != 0 )
    66                                 is_away = OPT_AWAY;
    6765                }
    6866                else
     
    7977                        bud->priority = 0;
    8078               
     79                if( bud && ( cap = xt_find_node( node->children, "c" ) ) &&
     80                    ( s = xt_find_attr( cap, "xmlns" ) ) && strcmp( s, XMLNS_CAPS ) == 0 )
     81                {
     82                        /* This <presence> stanza includes an XEP-0115
     83                           capabilities part. Not too interesting, but we can
     84                           see if it has an ext= attribute. */
     85                        s = xt_find_attr( cap, "ext" );
     86                        if( s && ( strstr( s, "cstates" ) || strstr( s, "chatstate" ) ) )
     87                                bud->flags |= JBFLAG_DOES_XEP85;
     88                       
     89                        /* This field can contain more information like xhtml
     90                           support, but we don't support that ourselves.
     91                           Officially the ext= tag was deprecated, but enough
     92                           clients do send it.
     93                           
     94                           (I'm aware that this is not the right way to use
     95                           this field.) See for an explanation of ext=:
     96                           http://www.xmpp.org/extensions/attic/xep-0115-1.3.html*/
     97                }
     98               
    8199                if( is_chat )
    82100                        jabber_chat_pkt_presence( ic, bud, node );
    83                 else if( bud == jabber_buddy_by_jid( ic, bud->bare_jid, 0 ) )
    84                         imcb_buddy_status( ic, bud->bare_jid, OPT_LOGGED_IN | is_away,
    85                                            ( is_away && bud->away_state ) ? bud->away_state->full_name : NULL,
    86                                            bud->away_message );
     101                else
     102                        send_presence = jabber_buddy_by_jid( ic, bud->bare_jid, 0 );
    87103        }
    88104        else if( strcmp( type, "unavailable" ) == 0 )
     
    119135                        /* If another resource is still available, send its presence
    120136                           information. */
    121                         if( ( bud = jabber_buddy_by_jid( ic, from, 0 ) ) )
    122                         {
    123                                 if( bud->away_state && ( *bud->away_state->code == 0 ||
    124                                     strcmp( bud->away_state->code, "chat" ) == 0 ) )
    125                                         is_away = OPT_AWAY;
    126                                
    127                                 imcb_buddy_status( ic, bud->bare_jid, OPT_LOGGED_IN | is_away,
    128                                                    ( is_away && bud->away_state ) ? bud->away_state->full_name : NULL,
    129                                                    bud->away_message );
    130                         }
    131                         else
     137                        if( ( send_presence = jabber_buddy_by_jid( ic, from, 0 ) ) == NULL )
    132138                        {
    133139                                /* Otherwise, count him/her as offline now. */
     
    177183                } */
    178184        }
     185
     186        if( send_presence )
     187        {
     188                int is_away = 0;
     189
     190                if( send_presence->away_state && !( *send_presence->away_state->code == 0 ||
     191                    strcmp( send_presence->away_state->code, "chat" ) == 0 ) )
     192                        is_away = OPT_AWAY;
     193
     194                imcb_buddy_status( ic, send_presence->bare_jid, OPT_LOGGED_IN | is_away,
     195                                   ( is_away && send_presence->away_state ) ?
     196                                   send_presence->away_state->full_name : NULL,
     197                                   send_presence->away_message );
     198        }
    179199       
    180200        return XT_HANDLED;
     
    186206{
    187207        struct jabber_data *jd = ic->proto_data;
    188         struct xt_node *node;
     208        struct xt_node *node, *cap;
    189209        char *show = jd->away_state->code;
    190210        char *status = jd->away_message;
     
    199219                xt_add_child( node, xt_new_node( "status", status, NULL ) );
    200220       
     221        /* This makes the packet slightly bigger, but clients interested in
     222           capabilities can now cache the discovery info. This reduces the
     223           usual post-login iq-flood. See XEP-0115. At least libpurple and
     224           Trillian seem to do this right. */
     225        cap = xt_new_node( "c", NULL, NULL );
     226        xt_add_attr( cap, "xmlns", XMLNS_CAPS );
     227        xt_add_attr( cap, "node", "http://bitlbee.org/xmpp/caps" );
     228        xt_add_attr( cap, "ver", BITLBEE_VERSION ); /* The XEP wants this hashed, but nobody's doing that. */
     229        xt_add_child( node, cap );
     230       
    201231        st = jabber_write_packet( ic, node );
    202232       
Note: See TracChangeset for help on using the changeset viewer.