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