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