diff options
Diffstat (limited to 'protocols/jabber/jabber_util.c')
-rw-r--r-- | protocols/jabber/jabber_util.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/protocols/jabber/jabber_util.c b/protocols/jabber/jabber_util.c index f4cd40d4..357743d3 100644 --- a/protocols/jabber/jabber_util.c +++ b/protocols/jabber/jabber_util.c @@ -246,7 +246,8 @@ struct jabber_buddy *jabber_buddy_add( struct gaim_connection *gc, char *full_ji } *s = '/'; - new->resource = g_strdup( s + 1 ); + new->full_jid = g_strdup( full_jid ); + new->resource = strchr( new->full_jid, '/' ) + 1; return new; } @@ -267,8 +268,24 @@ struct jabber_buddy *jabber_buddy_by_jid( struct gaim_connection *gc, char *jid } else { - /* TODO: Add selection. */ - return g_hash_table_lookup( jd->buddies, jid ); + struct jabber_buddy *best_prio, *best_time; + char *set; + + best_prio = best_time = bud = g_hash_table_lookup( jd->buddies, jid ); + for( ; bud; bud = bud->next ) + { + if( bud->priority > best_prio->priority ) + best_prio = bud; + if( bud->last_act > best_time->last_act ) + best_time = bud; + } + + if( ( set = set_getstr( &gc->acc->set, "resource_select" ) ) == NULL ) + return NULL; + else if( strcmp( set, "activity" ) == 0 ) + return best_time; + else /* if( strcmp( set, "priority" ) == 0 ) */ + return best_prio; } *s = '/'; @@ -294,7 +311,7 @@ int jabber_buddy_remove( struct gaim_connection *gc, char *full_jid ) { g_hash_table_remove( jd->buddies, bud->handle ); g_free( bud->handle ); - g_free( bud->resource ); + g_free( bud->full_jid ); g_free( bud->away_message ); g_free( bud ); } @@ -313,7 +330,7 @@ int jabber_buddy_remove( struct gaim_connection *gc, char *full_jid ) item, because we're removing the first. */ g_hash_table_replace( jd->buddies, bi->handle, bi->next ); - g_free( bi->resource ); + g_free( bi->full_jid ); g_free( bi->away_message ); g_free( bi ); } |