| 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); |