Changes in / [638feab:6ce01be]


Ignore:
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • protocols/jabber/jabber.c

    r638feab r6ce01be  
    5757        set_t *s;
    5858        char str[16];
    59        
    60         s = set_add( &acc->set, "activity_timeout", "600", set_eval_int, acc );
    6159       
    6260        g_snprintf( str, sizeof( str ), "%d", jabber_port_list[0] );
     
    309307                bud = jabber_buddy_by_ext_jid( ic, who, 0 );
    310308        else
    311                 bud = jabber_buddy_by_jid( ic, who, GET_BUDDY_BARE_OK );
     309                bud = jabber_buddy_by_jid( ic, who, 0 );
    312310       
    313311        node = xt_new_node( "body", message, NULL );
     
    354352static void jabber_get_info( struct im_connection *ic, char *who )
    355353{
     354        struct jabber_data *jd = ic->proto_data;
    356355        struct jabber_buddy *bud;
    357356       
    358         bud = jabber_buddy_by_jid( ic, who, GET_BUDDY_FIRST );
     357        if( strchr( who, '/' ) )
     358                bud = jabber_buddy_by_jid( ic, who, 0 );
     359        else
     360        {
     361                char *s = jabber_normalize( who );
     362                bud = g_hash_table_lookup( jd->buddies, s );
     363                g_free( s );
     364        }
    359365       
    360366        while( bud )
  • protocols/jabber/jabber.h

    r638feab r6ce01be  
    108108};
    109109
    110 /* Somewhat messy data structure: We have a hash table with the bare JID as
    111    the key and the head of a struct jabber_buddy list as the value. The head
    112    is always a bare JID. If the JID has other resources (often the case,
    113    except for some transports that don't support multiple resources), those
    114    follow. In that case, the bare JID at the beginning doesn't actually
    115    refer to a real session and should only be used for operations that
    116    support incomplete JIDs. */
    117110struct jabber_buddy
    118111{
     
    128121        char *away_message;
    129122       
    130         time_t last_msg;
     123        time_t last_act;
    131124        jabber_buddy_flags_t flags;
    132125       
     
    216209        GET_BUDDY_EXACT = 2,    /* Get an exact match (only makes sense with bare JIDs). */
    217210        GET_BUDDY_FIRST = 4,    /* No selection, simply get the first resource for this JID. */
    218         GET_BUDDY_BARE = 8,     /* Get the bare version of the JID (possibly inexistent). */
    219         GET_BUDDY_BARE_OK = 16, /* Allow returning a bare JID if that seems better. */
    220211} get_buddy_flags_t;
    221212
  • protocols/jabber/jabber_util.c

    r638feab r6ce01be  
    44*  Jabber module - Misc. stuff                                              *
    55*                                                                           *
    6 *  Copyright 2006-2010 Wilmer van der Gaast <wilmer@gaast.net>             
     6*  Copyright 2006 Wilmer van der Gaast <wilmer@gaast.net>                   *
    77*                                                                           *
    88*  This program is free software; you can redistribute it and/or modify     *
     
    345345        if( ( bud = g_hash_table_lookup( jd->buddies, full_jid ) ) )
    346346        {
    347                 /* The first entry is always a bare JID. If there are more, we
    348                    should ignore the first one here. */
    349                 if( bud->next )
    350                         bud = bud->next;
    351                
    352347                /* If this is a transport buddy or whatever, it can't have more
    353348                   than one instance, so this is always wrong: */
     
    384379        else
    385380        {
    386                 new->full_jid = new->bare_jid = g_strdup( full_jid );
     381                /* Keep in mind that full_jid currently isn't really
     382                   a full JID... */
     383                new->bare_jid = g_strdup( full_jid );
    387384                g_hash_table_insert( jd->buddies, new->bare_jid, new );
    388                
    389                 if( s )
    390                 {
    391                         new->next = g_new0( struct jabber_buddy, 1 );
    392                         new->next->bare_jid = new->bare_jid;
    393                         new = new->next;
    394                 }
    395385        }
    396386       
     
    418408{
    419409        struct jabber_data *jd = ic->proto_data;
    420         struct jabber_buddy *bud, *head;
     410        struct jabber_buddy *bud;
    421411        char *s, *jid;
    422412       
     
    430420                if( ( bud = g_hash_table_lookup( jd->buddies, jid ) ) )
    431421                {
    432                         bare_exists = 1;
    433                        
    434                         if( bud->next )
    435                                 bud = bud->next;
    436                        
    437422                        /* Just return the first one for this bare JID. */
    438423                        if( flags & GET_BUDDY_FIRST )
     
    456441                                        break;
    457442                }
     443                else
     444                {
     445                        /* This variable tells the if down here that the bare
     446                           JID already exists and we should feel free to add
     447                           more resources, if the caller asked for that. */
     448                        bare_exists = 1;
     449                }
    458450               
    459451                if( bud == NULL && ( flags & GET_BUDDY_CREAT ) &&
    460                     ( bare_exists || imcb_find_buddy( ic, jid ) ) )
     452                    ( !bare_exists || imcb_find_buddy( ic, jid ) ) )
    461453                {
    462454                        *s = '/';
     
    472464                char *set;
    473465               
    474                 head = g_hash_table_lookup( jd->buddies, jid );
    475                 bud = ( head && head->next ) ? head->next : head;
     466                bud = g_hash_table_lookup( jd->buddies, jid );
    476467               
    477468                g_free( jid );
     
    490481                        /* Looks like the caller doesn't care about details. */
    491482                        return bud;
    492                 else if( flags & GET_BUDDY_BARE )
    493                         return head;
    494483               
    495484                best_prio = best_time = bud;
     
    498487                        if( bud->priority > best_prio->priority )
    499488                                best_prio = bud;
    500                         if( bud->last_msg > best_time->last_msg )
     489                        if( bud->last_act > best_time->last_act )
    501490                                best_time = bud;
    502491                }
     
    504493                if( ( set = set_getstr( &ic->acc->set, "resource_select" ) ) == NULL )
    505494                        return NULL;
    506                 else if( strcmp( set, "priority" ) == 0 )
     495                else if( strcmp( set, "activity" ) == 0 )
     496                        return best_time;
     497                else /* if( strcmp( set, "priority" ) == 0 ) */
    507498                        return best_prio;
    508                 else if( flags & GET_BUDDY_BARE_OK ) /* && strcmp( set, "activity" ) == 0 */
    509                 {
    510                         if( best_time->last_msg + set_getint( &ic->acc->set, "activity_timeout" ) >= time( NULL ) )
    511                                 return best_time;
    512                         else
    513                                 return head;
    514                 }
    515                 else
    516                         return best_time;
    517499        }
    518500}
     
    556538{
    557539        struct jabber_data *jd = ic->proto_data;
    558         struct jabber_buddy *bud, *prev = NULL, *bi;
     540        struct jabber_buddy *bud, *prev, *bi;
    559541        char *s, *full_jid;
    560542       
     
    566548        if( ( bud = g_hash_table_lookup( jd->buddies, full_jid ) ) )
    567549        {
    568                 if( bud->next )
    569                         bud = (prev=bud)->next;
    570                
    571550                /* If there's only one item in the list (and if the resource
    572551                   matches), removing it is simple. (And the hash reference
     
    576555                      ( bud->resource && s && strcmp( bud->resource, s + 1 ) == 0 ) ) )
    577556                {
    578                         return jabber_buddy_remove_bare( ic, full_jid );
     557                        g_hash_table_remove( jd->buddies, bud->bare_jid );
     558                        g_free( bud->bare_jid );
     559                        g_free( bud->ext_jid );
     560                        g_free( bud->full_jid );
     561                        g_free( bud->away_message );
     562                        g_free( bud );
     563                       
     564                        g_free( full_jid );
     565                       
     566                        return 1;
    579567                }
    580568                else if( s == NULL || bud->resource == NULL )
     
    587575                else
    588576                {
    589                         for( bi = bud; bi; bi = (prev=bi)->next )
     577                        for( bi = bud, prev = NULL; bi; bi = (prev=bi)->next )
    590578                                if( strcmp( bi->resource, s + 1 ) == 0 )
    591579                                        break;
     
    598586                                        prev->next = bi->next;
    599587                                else
    600                                         /* Don't think this should ever happen anymore. */
     588                                        /* The hash table should point at the second
     589                                           item, because we're removing the first. */
    601590                                        g_hash_table_replace( jd->buddies, bi->bare_jid, bi->next );
    602591                               
  • protocols/jabber/message.c

    r638feab r6ce01be  
    7171                        if( bud )
    7272                        {
    73                                 bud->last_msg = time( NULL );
     73                                bud->last_act = time( NULL );
    7474                                from = bud->ext_jid ? : bud->bare_jid;
    7575                        }
  • protocols/jabber/presence.c

    r638feab r6ce01be  
    6868                {
    6969                        bud->away_state = NULL;
     70                        /* Let's only set last_act if there's *no* away state,
     71                           since it could be some auto-away thingy. */
     72                        bud->last_act = time( NULL );
    7073                }
    7174               
  • tests/check_jabber_util.c

    r638feab r6ce01be  
    1414       
    1515        budw1 = jabber_buddy_add( ic, "wilmer@gaast.net/BitlBee" );
    16         budw1->last_msg = time( NULL ) - 100;
     16        budw1->last_act = time( NULL ) - 100;
    1717        budw2 = jabber_buddy_add( ic, "WILMER@gaast.net/Telepathy" );
    1818        budw2->priority = 2;
    19         budw2->last_msg = time( NULL );
     19        budw2->last_act = time( NULL );
    2020        budw3 = jabber_buddy_add( ic, "wilmer@GAAST.NET/bitlbee" );
    21         budw3->last_msg = time( NULL ) - 200;
     21        budw3->last_act = time( NULL ) - 200;
    2222        budw3->priority = 4;
    2323        /* TODO(wilmer): Shouldn't this just return budw3? */
     
    6060        fail_unless( jabber_buddy_remove( ic, "wilmer@gaast.net/Telepathy" ) );
    6161        fail_unless( jabber_buddy_remove( ic, "wilmer@gaast.net/telepathy" ) );
    62        
    63         /* Test activity_timeout and GET_BUDDY_BARE_OK. */
    64         fail_unless( jabber_buddy_by_jid( ic, "wilmer@gaast.net", GET_BUDDY_BARE_OK ) == budw1 );
    65         budw1->last_msg -= 50;
    66         fail_unless( ( bud = jabber_buddy_by_jid( ic, "wilmer@gaast.net", GET_BUDDY_BARE_OK ) ) != NULL );
    67         fail_unless( strcmp( bud->full_jid, "wilmer@gaast.net" ) == 0 );
     62        fail_unless( jabber_buddy_by_jid( ic, "wilmer@gaast.net", 0 ) == budw1 );
    6863       
    6964        fail_if( jabber_buddy_remove( ic, "wilmer@gaast.net" ) );
    7065        fail_unless( jabber_buddy_by_jid( ic, "wilmer@gaast.net", 0 ) == budw1 );
    7166       
    72         fail_if( jabber_buddy_remove( ic, "wilmer@gaast.net" ) );
    73         fail_unless( jabber_buddy_remove( ic, "wilmer@gaast.net/bitlbee" ) );
    74         fail_unless( jabber_buddy_remove( ic, "wilmer@gaast.net/BitlBee" ) );
    75         fail_if( jabber_buddy_by_jid( ic, "wilmer@gaast.net", GET_BUDDY_BARE_OK ) );
    76        
    7767        /* Check if remove_bare() indeed gets rid of all. */
    78         /* disable this one for now.
    7968        fail_unless( jabber_buddy_remove_bare( ic, "wilmer@gaast.net" ) );
    8069        fail_if( jabber_buddy_by_jid( ic, "wilmer@gaast.net", 0 ) );
    81         */
    8270
    8371        fail_if( jabber_buddy_remove( ic, "nekkid@lamejab.net/Illegal" ) );
    8472        fail_unless( jabber_buddy_remove( ic, "nekkid@lamejab.net" ) );
    8573        fail_if( jabber_buddy_by_jid( ic, "nekkid@lamejab.net", 0 ) );
    86        
    87         /* Fixing a bug in this branch that caused information to get lost when
    88            removing the first full JID from a list. */
    89         jabber_buddy_add( ic, "bugtest@google.com/A" );
    90         jabber_buddy_add( ic, "bugtest@google.com/B" );
    91         jabber_buddy_add( ic, "bugtest@google.com/C" );
    92         fail_unless( jabber_buddy_remove( ic, "bugtest@google.com/A" ) );
    93         fail_unless( jabber_buddy_remove( ic, "bugtest@google.com/B" ) );
    94         fail_unless( jabber_buddy_remove( ic, "bugtest@google.com/C" ) );
    9574}
    9675
     
    10685        jd->buddies = g_hash_table_new( g_str_hash, g_str_equal );
    10786        set_add( &ic->acc->set, "resource_select", "priority", NULL, ic->acc );
    108         set_add( &ic->acc->set, "activity_timeout", "120", NULL, ic->acc );
    10987       
    11088        suite_add_tcase (s, tc_core);
Note: See TracChangeset for help on using the changeset viewer.