Changes in / [8b6b740:be609ff]
- Location:
- protocols/jabber
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
protocols/jabber/jabber.c
r8b6b740 rbe609ff 58 58 char str[16]; 59 59 60 s = set_add( &acc->set, "activity_timeout", "600", set_eval_int, acc ); 61 60 62 g_snprintf( str, sizeof( str ), "%d", jabber_port_list[0] ); 61 63 s = set_add( &acc->set, "port", str, set_eval_int, acc ); … … 67 69 s->flags |= ACC_SET_OFFLINE_ONLY; 68 70 69 s = set_add( &acc->set, "resource_select", " priority", NULL, acc );71 s = set_add( &acc->set, "resource_select", "activity", NULL, acc ); 70 72 71 73 s = set_add( &acc->set, "server", NULL, set_eval_account, acc ); … … 307 309 bud = jabber_buddy_by_ext_jid( ic, who, 0 ); 308 310 else 309 bud = jabber_buddy_by_jid( ic, who, 0);311 bud = jabber_buddy_by_jid( ic, who, GET_BUDDY_BARE_OK ); 310 312 311 313 node = xt_new_node( "body", message, NULL ); … … 352 354 static void jabber_get_info( struct im_connection *ic, char *who ) 353 355 { 354 struct jabber_data *jd = ic->proto_data;355 356 struct jabber_buddy *bud; 356 357 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 } 358 bud = jabber_buddy_by_jid( ic, who, GET_BUDDY_FIRST ); 365 359 366 360 while( bud ) -
protocols/jabber/jabber.h
r8b6b740 rbe609ff 107 107 }; 108 108 109 /* Somewhat messy data structure: We have a hash table with the bare JID as 110 the key and the head of a struct jabber_buddy list as the value. The head 111 is always a bare JID. If the JID has other resources (often the case, 112 except for some transports that don't support multiple resources), those 113 follow. In that case, the bare JID at the beginning doesn't actually 114 refer to a real session and should only be used for operations that 115 support incomplete JIDs. */ 109 116 struct jabber_buddy 110 117 { … … 120 127 char *away_message; 121 128 122 time_t last_ act;129 time_t last_msg; 123 130 jabber_buddy_flags_t flags; 124 131 … … 208 215 GET_BUDDY_EXACT = 2, /* Get an exact match (only makes sense with bare JIDs). */ 209 216 GET_BUDDY_FIRST = 4, /* No selection, simply get the first resource for this JID. */ 217 GET_BUDDY_BARE = 8, /* Get the bare version of the JID (possibly inexistent). */ 218 GET_BUDDY_BARE_OK = 16, /* Allow returning a bare JID if that seems better. */ 210 219 } get_buddy_flags_t; 211 220 -
protocols/jabber/jabber_util.c
r8b6b740 rbe609ff 345 345 if( ( bud = g_hash_table_lookup( jd->buddies, full_jid ) ) ) 346 346 { 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 347 352 /* If this is a transport buddy or whatever, it can't have more 348 353 than one instance, so this is always wrong: */ … … 379 384 else 380 385 { 381 /* Keep in mind that full_jid currently isn't really 382 a full JID... */ 383 new->bare_jid = g_strdup( full_jid ); 386 new->full_jid = new->bare_jid = g_strdup( full_jid ); 384 387 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 } 385 395 } 386 396 … … 408 418 { 409 419 struct jabber_data *jd = ic->proto_data; 410 struct jabber_buddy *bud ;420 struct jabber_buddy *bud, *head; 411 421 char *s, *jid; 412 422 … … 420 430 if( ( bud = g_hash_table_lookup( jd->buddies, jid ) ) ) 421 431 { 432 bare_exists = 1; 433 434 if( bud->next ) 435 bud = bud->next; 436 422 437 /* Just return the first one for this bare JID. */ 423 438 if( flags & GET_BUDDY_FIRST ) … … 441 456 break; 442 457 } 443 else444 {445 /* This variable tells the if down here that the bare446 JID already exists and we should feel free to add447 more resources, if the caller asked for that. */448 bare_exists = 1;449 }450 458 451 459 if( bud == NULL && ( flags & GET_BUDDY_CREAT ) && 452 ( !bare_exists || imcb_find_buddy( ic, jid )) )460 ( imcb_find_buddy( ic, jid ) || bare_exists ) ) 453 461 { 454 462 *s = '/'; … … 464 472 char *set; 465 473 466 bud = g_hash_table_lookup( jd->buddies, jid ); 474 head = g_hash_table_lookup( jd->buddies, jid ); 475 bud = ( head && head->next ) ? head->next : head; 467 476 468 477 g_free( jid ); … … 481 490 /* Looks like the caller doesn't care about details. */ 482 491 return bud; 492 else if( flags & GET_BUDDY_BARE ) 493 return head; 483 494 484 495 best_prio = best_time = bud; … … 487 498 if( bud->priority > best_prio->priority ) 488 499 best_prio = bud; 489 if( bud->last_ act > best_time->last_act)500 if( bud->last_msg > best_time->last_msg ) 490 501 best_time = bud; 491 502 } … … 493 504 if( ( set = set_getstr( &ic->acc->set, "resource_select" ) ) == NULL ) 494 505 return NULL; 495 else if( strcmp( set, "activity" ) == 0 ) 506 else if( strcmp( set, "priority" ) == 0 ) 507 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 496 516 return best_time; 497 else /* if( strcmp( set, "priority" ) == 0 ) */498 return best_prio;499 517 } 500 518 } … … 548 566 if( ( bud = g_hash_table_lookup( jd->buddies, full_jid ) ) ) 549 567 { 568 if( bud->next ) 569 bud = bud->next; 570 550 571 /* If there's only one item in the list (and if the resource 551 572 matches), removing it is simple. (And the hash reference … … 555 576 ( bud->resource && s && strcmp( bud->resource, s + 1 ) == 0 ) ) ) 556 577 { 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; 578 return jabber_buddy_remove_bare( ic, full_jid ); 567 579 } 568 580 else if( s == NULL || bud->resource == NULL ) -
protocols/jabber/message.c
r8b6b740 rbe609ff 71 71 if( bud ) 72 72 { 73 bud->last_ act= time( NULL );73 bud->last_msg = time( NULL ); 74 74 from = bud->ext_jid ? : bud->bare_jid; 75 75 } -
protocols/jabber/presence.c
r8b6b740 rbe609ff 68 68 { 69 69 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 );73 70 } 74 71
Note: See TracChangeset
for help on using the changeset viewer.