Changeset 81ee561 for protocols/jabber/jabber_util.c
- Timestamp:
- 2010-03-20T18:03:18Z (15 years ago)
- Branches:
- master
- Children:
- 85693e6
- Parents:
- 3330468 (diff), 0baed0d (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
protocols/jabber/jabber_util.c
r3330468 r81ee561 4 4 * Jabber module - Misc. stuff * 5 5 * * 6 * Copyright 2006 Wilmer van der Gaast <wilmer@gaast.net> *6 * Copyright 2006-2010 Wilmer van der Gaast <wilmer@gaast.net> 7 7 * * 8 8 * This program is free software; you can redistribute it and/or modify * … … 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 ( bare_exists || imcb_find_buddy( ic, jid ) ) ) 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 } … … 538 556 { 539 557 struct jabber_data *jd = ic->proto_data; 540 struct jabber_buddy *bud, *prev , *bi;558 struct jabber_buddy *bud, *prev = NULL, *bi; 541 559 char *s, *full_jid; 542 560 … … 548 566 if( ( bud = g_hash_table_lookup( jd->buddies, full_jid ) ) ) 549 567 { 568 if( bud->next ) 569 bud = (prev=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 ) … … 575 587 else 576 588 { 577 for( bi = bud , prev = NULL; bi; bi = (prev=bi)->next )589 for( bi = bud; bi; bi = (prev=bi)->next ) 578 590 if( strcmp( bi->resource, s + 1 ) == 0 ) 579 591 break; … … 586 598 prev->next = bi->next; 587 599 else 588 /* The hash table should point at the second 589 item, because we're removing the first. */ 600 /* Don't think this should ever happen anymore. */ 590 601 g_hash_table_replace( jd->buddies, bi->bare_jid, bi->next ); 591 602
Note: See TracChangeset
for help on using the changeset viewer.