Mercurial > pidgin
comparison src/blist.c @ 11910:700ec4523c04
[gaim-migrate @ 14201]
begone, buddy->present!
committer: Tailor Script <tailor@pidgin.im>
author | Nathan Walp <nwalp@pidgin.im> |
---|---|
date | Sun, 30 Oct 2005 23:33:36 +0000 |
parents | ec7c3da0e718 |
children | cb73483c9f63 |
comparison
equal
deleted
inserted
replaced
11909:1b029c5898af | 11910:700ec4523c04 |
---|---|
708 | 708 |
709 if (ops && ops->set_visible) | 709 if (ops && ops->set_visible) |
710 ops->set_visible(gaimbuddylist, show); | 710 ops->set_visible(gaimbuddylist, show); |
711 } | 711 } |
712 | 712 |
713 static gboolean presence_update_timeout_cb(GaimBuddy *buddy) | |
714 { | |
715 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; | |
716 GaimConversation *conv; | |
717 | |
718 g_return_val_if_fail(buddy != NULL, FALSE); | |
719 | |
720 if (buddy->present == GAIM_BUDDY_SIGNING_ON) { | |
721 buddy->present = GAIM_BUDDY_ONLINE; | |
722 } else if (buddy->present == GAIM_BUDDY_SIGNING_OFF) { | |
723 buddy->present = GAIM_BUDDY_OFFLINE; | |
724 ((GaimContact*)((GaimBlistNode*)buddy)->parent)->online--; | |
725 if (((GaimContact*)((GaimBlistNode*)buddy)->parent)->online == 0) | |
726 ((GaimGroup *)((GaimBlistNode *)buddy)->parent->parent)->online--; | |
727 } | |
728 | |
729 buddy->timer = 0; | |
730 | |
731 if (ops && ops->update) | |
732 ops->update(gaimbuddylist, (GaimBlistNode*)buddy); | |
733 | |
734 conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, buddy->name, | |
735 buddy->account); | |
736 if (conv) { | |
737 if (buddy->present == GAIM_BUDDY_ONLINE) | |
738 gaim_conversation_update(conv, GAIM_CONV_ACCOUNT_ONLINE); | |
739 else if (buddy->present == GAIM_BUDDY_OFFLINE) | |
740 gaim_conversation_update(conv, GAIM_CONV_ACCOUNT_OFFLINE); | |
741 } | |
742 | |
743 return FALSE; | |
744 } | |
745 | |
746 void | 713 void |
747 gaim_blist_update_buddy_status(GaimBuddy *buddy, GaimStatus *old_status) | 714 gaim_blist_update_buddy_status(GaimBuddy *buddy, GaimStatus *old_status) |
748 { | 715 { |
749 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; | 716 GaimBlistUiOps *ops = gaimbuddylist->ui_ops; |
750 GaimPresence *presence; | 717 GaimPresence *presence; |
759 gaim_debug_info("blist", "Updating buddy status for %s (%s)\n", | 726 gaim_debug_info("blist", "Updating buddy status for %s (%s)\n", |
760 buddy->name, gaim_account_get_protocol_name(buddy->account)); | 727 buddy->name, gaim_account_get_protocol_name(buddy->account)); |
761 | 728 |
762 if (gaim_status_is_online(status) && | 729 if (gaim_status_is_online(status) && |
763 !gaim_status_is_online(old_status)) { | 730 !gaim_status_is_online(old_status)) { |
764 int old_present = buddy->present; | 731 |
765 | |
766 buddy->present = GAIM_BUDDY_SIGNING_ON; | |
767 gaim_signal_emit(gaim_blist_get_handle(), "buddy-signed-on", buddy); | 732 gaim_signal_emit(gaim_blist_get_handle(), "buddy-signed-on", buddy); |
768 if (old_present != GAIM_BUDDY_SIGNING_OFF) { | 733 |
769 ((GaimContact*)((GaimBlistNode*)buddy)->parent)->online++; | 734 ((GaimContact*)((GaimBlistNode*)buddy)->parent)->online++; |
770 if (((GaimContact*)((GaimBlistNode*)buddy)->parent)->online == 1) | 735 if (((GaimContact*)((GaimBlistNode*)buddy)->parent)->online == 1) |
771 ((GaimGroup *)((GaimBlistNode *)buddy)->parent->parent)->online++; | 736 ((GaimGroup *)((GaimBlistNode *)buddy)->parent->parent)->online++; |
772 } | |
773 if (buddy->timer > 0) | |
774 gaim_timeout_remove(buddy->timer); | |
775 buddy->timer = gaim_timeout_add(10000, (GSourceFunc)presence_update_timeout_cb, buddy); | |
776 | |
777 } else if (!gaim_status_is_online(status) && | 737 } else if (!gaim_status_is_online(status) && |
778 gaim_status_is_online(old_status)) { | 738 gaim_status_is_online(old_status)) { |
779 buddy->present = GAIM_BUDDY_SIGNING_OFF; | |
780 gaim_blist_node_set_int(&buddy->node, "last_seen", time(NULL)); | 739 gaim_blist_node_set_int(&buddy->node, "last_seen", time(NULL)); |
781 gaim_signal_emit(gaim_blist_get_handle(), "buddy-signed-off", buddy); | 740 gaim_signal_emit(gaim_blist_get_handle(), "buddy-signed-off", buddy); |
782 if (buddy->timer > 0) | 741 ((GaimContact*)((GaimBlistNode*)buddy)->parent)->online--; |
783 gaim_timeout_remove(buddy->timer); | 742 if (((GaimContact*)((GaimBlistNode*)buddy)->parent)->online == 0) |
784 buddy->timer = gaim_timeout_add(10000, (GSourceFunc)presence_update_timeout_cb, buddy); | 743 ((GaimGroup *)((GaimBlistNode *)buddy)->parent->parent)->online--; |
785 | |
786 } else if (gaim_status_is_available(status) && | 744 } else if (gaim_status_is_available(status) && |
787 !gaim_status_is_available(old_status)) { | 745 !gaim_status_is_available(old_status)) { |
788 gaim_signal_emit(gaim_blist_get_handle(), "buddy-back", buddy); | 746 gaim_signal_emit(gaim_blist_get_handle(), "buddy-back", buddy); |
789 | 747 |
790 } else if (!gaim_status_is_available(status) && | 748 } else if (!gaim_status_is_available(status) && |
1779 | 1737 |
1780 /* Signal that the buddy has been removed before freeing the memory for it */ | 1738 /* Signal that the buddy has been removed before freeing the memory for it */ |
1781 gaim_signal_emit(gaim_blist_get_handle(), "buddy-removed", buddy); | 1739 gaim_signal_emit(gaim_blist_get_handle(), "buddy-removed", buddy); |
1782 | 1740 |
1783 /* Delete the node */ | 1741 /* Delete the node */ |
1784 if (buddy->timer > 0) | |
1785 gaim_timeout_remove(buddy->timer); | |
1786 if (buddy->icon != NULL) | 1742 if (buddy->icon != NULL) |
1787 gaim_buddy_icon_unref(buddy->icon); | 1743 gaim_buddy_icon_unref(buddy->icon); |
1788 g_hash_table_destroy(buddy->node.settings); | 1744 g_hash_table_destroy(buddy->node.settings); |
1789 gaim_presence_remove_buddy(buddy->presence, buddy); | 1745 gaim_presence_remove_buddy(buddy->presence, buddy); |
1790 gaim_presence_destroy(buddy->presence); | 1746 gaim_presence_destroy(buddy->presence); |