Mercurial > pidgin.yaz
comparison libpurple/protocols/jabber/presence.c @ 26856:867e231bffbc
A little bit better (free memory and support receiving the nick in subscriptions) and Changelog.
author | Paul Aurich <paul@darkrain42.org> |
---|---|
date | Sat, 02 May 2009 04:39:38 +0000 |
parents | e816444c1a01 |
children | 5c4a4a0f5929 |
comparison
equal
deleted
inserted
replaced
26855:e816444c1a01 | 26856:867e231bffbc |
---|---|
439 xmlnode *y; | 439 xmlnode *y; |
440 gboolean muc = FALSE; | 440 gboolean muc = FALSE; |
441 char *avatar_hash = NULL; | 441 char *avatar_hash = NULL; |
442 xmlnode *caps = NULL; | 442 xmlnode *caps = NULL; |
443 int idle = 0; | 443 int idle = 0; |
444 const gchar *nick = NULL; | 444 gchar *nickname = NULL; |
445 | 445 |
446 if(!(jb = jabber_buddy_find(js, from, TRUE))) | 446 if(!(jb = jabber_buddy_find(js, from, TRUE))) |
447 return; | 447 return; |
448 | 448 |
449 if(!(jid = jabber_id_new(from))) | 449 if(!(jid = jabber_id_new(from))) |
462 } else if(type && !strcmp(type, "subscribe")) { | 462 } else if(type && !strcmp(type, "subscribe")) { |
463 struct _jabber_add_permit *jap = g_new0(struct _jabber_add_permit, 1); | 463 struct _jabber_add_permit *jap = g_new0(struct _jabber_add_permit, 1); |
464 gboolean onlist = FALSE; | 464 gboolean onlist = FALSE; |
465 PurpleBuddy *buddy = purple_find_buddy(purple_connection_get_account(js->gc), from); | 465 PurpleBuddy *buddy = purple_find_buddy(purple_connection_get_account(js->gc), from); |
466 JabberBuddy *jb = NULL; | 466 JabberBuddy *jb = NULL; |
467 xmlnode *nick; | |
468 | |
469 nick = xmlnode_get_child_with_namespace(packet, "nick", "http://jabber.org/protocol/nick"); | |
470 if (nick) | |
471 nickname = xmlnode_get_data(nick); | |
467 | 472 |
468 if (buddy) { | 473 if (buddy) { |
469 jb = jabber_buddy_find(js, from, TRUE); | 474 jb = jabber_buddy_find(js, from, TRUE); |
470 if ((jb->subscription & (JABBER_SUB_TO | JABBER_SUB_PENDING))) | 475 if ((jb->subscription & (JABBER_SUB_TO | JABBER_SUB_PENDING))) |
471 onlist = TRUE; | 476 onlist = TRUE; |
473 | 478 |
474 jap->gc = js->gc; | 479 jap->gc = js->gc; |
475 jap->who = g_strdup(from); | 480 jap->who = g_strdup(from); |
476 jap->js = js; | 481 jap->js = js; |
477 | 482 |
478 purple_account_request_authorization(purple_connection_get_account(js->gc), from, NULL, NULL, NULL, onlist, | 483 purple_account_request_authorization(purple_connection_get_account(js->gc), from, NULL, nickname, NULL, onlist, |
479 authorize_add_cb, deny_add_cb, jap); | 484 authorize_add_cb, deny_add_cb, jap); |
485 g_free(nickname); | |
480 jabber_id_free(jid); | 486 jabber_id_free(jid); |
481 return; | 487 return; |
482 } else if(type && !strcmp(type, "subscribed")) { | 488 } else if(type && !strcmp(type, "subscribed")) { |
483 /* we've been allowed to see their presence, but we don't care */ | 489 /* we've been allowed to see their presence, but we don't care */ |
484 jabber_id_free(jid); | 490 jabber_id_free(jid); |
526 delayed = TRUE; | 532 delayed = TRUE; |
527 stamp = xmlnode_get_attrib(y, "stamp"); | 533 stamp = xmlnode_get_attrib(y, "stamp"); |
528 } else if(!strcmp(y->name, "c") && !strcmp(xmlns, "http://jabber.org/protocol/caps")) { | 534 } else if(!strcmp(y->name, "c") && !strcmp(xmlns, "http://jabber.org/protocol/caps")) { |
529 caps = y; /* store for later, when creating buddy resource */ | 535 caps = y; /* store for later, when creating buddy resource */ |
530 } else if (g_str_equal(y->name, "nick") && g_str_equal(xmlns, "http://jabber.org/protocol/nick")) { | 536 } else if (g_str_equal(y->name, "nick") && g_str_equal(xmlns, "http://jabber.org/protocol/nick")) { |
531 nick = xmlnode_get_data(y); | 537 nickname = xmlnode_get_data(y); |
532 } else if(!strcmp(y->name, "x")) { | 538 } else if(!strcmp(y->name, "x")) { |
533 if(!strcmp(xmlns, "jabber:x:delay")) { | 539 if(!strcmp(xmlns, "jabber:x:delay")) { |
534 /* XXX: compare the time. jabber:x:delay can happen on presence packets that aren't really and truly delayed */ | 540 /* XXX: compare the time. jabber:x:delay can happen on presence packets that aren't really and truly delayed */ |
535 delayed = TRUE; | 541 delayed = TRUE; |
536 stamp = xmlnode_get_attrib(y, "stamp"); | 542 stamp = xmlnode_get_attrib(y, "stamp"); |
627 /* Only destroy the chat if the error happened while joining */ | 633 /* Only destroy the chat if the error happened while joining */ |
628 jabber_chat_destroy(chat); | 634 jabber_chat_destroy(chat); |
629 jabber_id_free(jid); | 635 jabber_id_free(jid); |
630 g_free(status); | 636 g_free(status); |
631 g_free(avatar_hash); | 637 g_free(avatar_hash); |
638 g_free(nickname); | |
632 return; | 639 return; |
633 } | 640 } |
634 | 641 |
635 | 642 |
636 if(type && !strcmp(type, "unavailable")) { | 643 if(type && !strcmp(type, "unavailable")) { |
643 jid->resource && chat->handle && !strcmp(jid->resource, chat->handle)) | 650 jid->resource && chat->handle && !strcmp(jid->resource, chat->handle)) |
644 jabber_chat_destroy(chat); | 651 jabber_chat_destroy(chat); |
645 jabber_id_free(jid); | 652 jabber_id_free(jid); |
646 g_free(status); | 653 g_free(status); |
647 g_free(avatar_hash); | 654 g_free(avatar_hash); |
655 g_free(nickname); | |
648 return; | 656 return; |
649 } | 657 } |
650 | 658 |
651 jabber_buddy_remove_resource(jb, jid->resource); | 659 jabber_buddy_remove_resource(jb, jid->resource); |
652 if(chat->muc) { | 660 if(chat->muc) { |
729 purple_debug_warning("jabber", "Got presence for unknown buddy %s on account %s (%p)\n", | 737 purple_debug_warning("jabber", "Got presence for unknown buddy %s on account %s (%p)\n", |
730 buddy_name, purple_account_get_username(js->gc->account), js->gc->account); | 738 buddy_name, purple_account_get_username(js->gc->account), js->gc->account); |
731 jabber_id_free(jid); | 739 jabber_id_free(jid); |
732 g_free(avatar_hash); | 740 g_free(avatar_hash); |
733 g_free(buddy_name); | 741 g_free(buddy_name); |
742 g_free(nickname); | |
734 g_free(status); | 743 g_free(status); |
735 return; | 744 return; |
736 } else { | 745 } else { |
737 /* this is a different resource of our own account. Resume even when this account isn't on our blist */ | 746 /* this is a different resource of our own account. Resume even when this account isn't on our blist */ |
738 } | 747 } |
785 | 794 |
786 if((found_jbr = jabber_buddy_find_resource(jb, NULL))) { | 795 if((found_jbr = jabber_buddy_find_resource(jb, NULL))) { |
787 jabber_google_presence_incoming(js, buddy_name, found_jbr); | 796 jabber_google_presence_incoming(js, buddy_name, found_jbr); |
788 purple_prpl_got_user_status(js->gc->account, buddy_name, jabber_buddy_state_get_status_id(found_jbr->state), "priority", found_jbr->priority, "message", found_jbr->status, NULL); | 797 purple_prpl_got_user_status(js->gc->account, buddy_name, jabber_buddy_state_get_status_id(found_jbr->state), "priority", found_jbr->priority, "message", found_jbr->status, NULL); |
789 purple_prpl_got_user_idle(js->gc->account, buddy_name, found_jbr->idle, found_jbr->idle); | 798 purple_prpl_got_user_idle(js->gc->account, buddy_name, found_jbr->idle, found_jbr->idle); |
790 if (nick) | 799 if (nickname) |
791 serv_got_alias(js->gc, buddy_name, nick); | 800 serv_got_alias(js->gc, buddy_name, nickname); |
792 } else { | 801 } else { |
793 purple_prpl_got_user_status(js->gc->account, buddy_name, "offline", status ? "message" : NULL, status, NULL); | 802 purple_prpl_got_user_status(js->gc->account, buddy_name, "offline", status ? "message" : NULL, status, NULL); |
794 } | 803 } |
795 g_free(buddy_name); | 804 g_free(buddy_name); |
796 } | 805 } |
813 (jabber_caps_get_info_cb)jabber_presence_set_capabilities, | 822 (jabber_caps_get_info_cb)jabber_presence_set_capabilities, |
814 userdata); | 823 userdata); |
815 } | 824 } |
816 } | 825 } |
817 | 826 |
827 g_free(nickname); | |
818 g_free(status); | 828 g_free(status); |
819 jabber_id_free(jid); | 829 jabber_id_free(jid); |
820 g_free(avatar_hash); | 830 g_free(avatar_hash); |
821 } | 831 } |
822 | 832 |