Changeset 814aa52 for protocols/jabber
- Timestamp:
- 2010-06-03T11:00:45Z (15 years ago)
- Branches:
- master
- Children:
- a6b2f13
- Parents:
- 5f8ab6a9 (diff), f4bcc22 (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. - Location:
- protocols/jabber
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
protocols/jabber/jabber.c
r5f8ab6a9 r814aa52 57 57 set_t *s; 58 58 char str[16]; 59 60 s = set_add( &acc->set, "activity_timeout", "600", set_eval_int, acc ); 59 61 60 62 g_snprintf( str, sizeof( str ), "%d", jabber_port_list[0] ); … … 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
r5f8ab6a9 r814aa52 108 108 }; 109 109 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. */ 110 117 struct jabber_buddy 111 118 { … … 121 128 char *away_message; 122 129 123 time_t last_ act;130 time_t last_msg; 124 131 jabber_buddy_flags_t flags; 125 132 … … 209 216 GET_BUDDY_EXACT = 2, /* Get an exact match (only makes sense with bare JIDs). */ 210 217 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. */ 211 220 } get_buddy_flags_t; 212 221 -
protocols/jabber/jabber_util.c
r5f8ab6a9 r814aa52 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 … … 656 667 time_t jabber_get_timestamp( struct xt_node *xt ) 657 668 { 658 struct tm tp, utc;659 669 struct xt_node *c; 660 time_t res, tres;661 670 char *s = NULL; 671 struct tm tp; 662 672 663 673 for( c = xt->children; ( c = xt_find_node( c, "x" ) ); c = c->next ) … … 677 687 tp.tm_year -= 1900; 678 688 tp.tm_mon --; 679 tp.tm_isdst = -1; /* GRRRRRRRRRRR */ 680 681 res = mktime( &tp ); 682 /* Problem is, mktime() just gave us the GMT timestamp for the 683 given local time... While the given time WAS NOT local. So 684 we should fix this now. 685 686 Now I could choose between messing with environment variables 687 (kludgy) or using timegm() (not portable)... Or doing the 688 following, which I actually prefer... */ 689 gmtime_r( &res, &utc ); 690 utc.tm_isdst = -1; /* Once more: GRRRRRRRRRRRRRRRRRR!!! */ 691 if( utc.tm_hour == tp.tm_hour && utc.tm_min == tp.tm_min ) 692 /* Sweet! We're in UTC right now... */ 693 return res; 694 695 tres = mktime( &utc ); 696 res += res - tres; 697 698 /* Yes, this is a hack. And it will go wrong around DST changes. 699 BUT this is more likely to be threadsafe than messing with 700 environment variables, and possibly more portable... */ 701 702 return res; 689 690 return mktime_utc( &tp ); 703 691 } 704 692 -
protocols/jabber/message.c
r5f8ab6a9 r814aa52 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 } … … 80 80 if( type && strcmp( type, "headline" ) == 0 ) 81 81 { 82 c = xt_find_node( node->children, "subject" );83 g_string_append_printf( fullmsg, "Headline: %s\n", c && c->text_len > 0 ? c->text : "");82 if( ( c = xt_find_node( node->children, "subject" ) ) && c->text_len > 0 ) 83 g_string_append_printf( fullmsg, "Headline: %s\n", c->text ); 84 84 85 85 /* <x xmlns="jabber:x:oob"><url>http://....</url></x> can contain a URL, it seems. */ -
protocols/jabber/presence.c
r5f8ab6a9 r814aa52 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.