Mercurial > pidgin
comparison libpurple/status.c @ 17177:d761647bc7c4
merge of '0a63bea05479d51972432a195d0c97c0309fbcf4'
and '8ff17e25184faaad69c1329218cd6898bc3e4c26'
author | Eric Polino <aluink@pidgin.im> |
---|---|
date | Sun, 13 May 2007 21:27:13 +0000 |
parents | d177369ce625 |
children | 3f11fad07eda |
comparison
equal
deleted
inserted
replaced
16936:f6de19624575 | 17177:d761647bc7c4 |
---|---|
131 -400, /* mobile */ | 131 -400, /* mobile */ |
132 -10, /* idle, special case. */ | 132 -10, /* idle, special case. */ |
133 -5, /* idle time, special case. */ | 133 -5, /* idle time, special case. */ |
134 10 /* Offline messageable */ | 134 10 /* Offline messageable */ |
135 }; | 135 }; |
136 | |
137 static GHashTable *buddy_presences = NULL; | |
138 | 136 |
139 #define SCORE_IDLE 8 | 137 #define SCORE_IDLE 8 |
140 #define SCORE_IDLE_TIME 9 | 138 #define SCORE_IDLE_TIME 9 |
141 #define SCORE_OFFLINE_MESSAGE 10 | 139 #define SCORE_OFFLINE_MESSAGE 10 |
142 | 140 |
1116 | 1114 |
1117 PurplePresence * | 1115 PurplePresence * |
1118 purple_presence_new_for_buddy(PurpleBuddy *buddy) | 1116 purple_presence_new_for_buddy(PurpleBuddy *buddy) |
1119 { | 1117 { |
1120 PurplePresence *presence; | 1118 PurplePresence *presence; |
1121 PurpleStatusBuddyKey *key; | |
1122 PurpleAccount *account; | 1119 PurpleAccount *account; |
1123 | 1120 |
1124 g_return_val_if_fail(buddy != NULL, NULL); | 1121 g_return_val_if_fail(buddy != NULL, NULL); |
1125 account = buddy->account; | 1122 account = buddy->account; |
1126 | 1123 |
1127 key = g_new0(PurpleStatusBuddyKey, 1); | 1124 presence = purple_presence_new(PURPLE_PRESENCE_CONTEXT_BUDDY); |
1128 key->account = buddy->account; | 1125 |
1129 key->name = g_strdup(buddy->name); | 1126 presence->u.buddy.name = g_strdup(buddy->name); |
1130 | 1127 presence->u.buddy.account = buddy->account; |
1131 presence = g_hash_table_lookup(buddy_presences, key); | 1128 presence->statuses = purple_prpl_get_statuses(buddy->account, presence); |
1132 if (presence == NULL) | 1129 |
1133 { | |
1134 presence = purple_presence_new(PURPLE_PRESENCE_CONTEXT_BUDDY); | |
1135 | |
1136 presence->u.buddy.name = g_strdup(buddy->name); | |
1137 presence->u.buddy.account = buddy->account; | |
1138 presence->statuses = purple_prpl_get_statuses(buddy->account, presence); | |
1139 | |
1140 g_hash_table_insert(buddy_presences, key, presence); | |
1141 } | |
1142 else | |
1143 { | |
1144 g_free(key->name); | |
1145 g_free(key); | |
1146 } | |
1147 presence->u.buddy.buddy = buddy; | 1130 presence->u.buddy.buddy = buddy; |
1148 | 1131 |
1149 return presence; | 1132 return presence; |
1150 } | 1133 } |
1151 | 1134 |
1154 { | 1137 { |
1155 g_return_if_fail(presence != NULL); | 1138 g_return_if_fail(presence != NULL); |
1156 | 1139 |
1157 if (purple_presence_get_context(presence) == PURPLE_PRESENCE_CONTEXT_BUDDY) | 1140 if (purple_presence_get_context(presence) == PURPLE_PRESENCE_CONTEXT_BUDDY) |
1158 { | 1141 { |
1159 PurpleStatusBuddyKey key; | |
1160 | |
1161 key.account = presence->u.buddy.account; | |
1162 key.name = presence->u.buddy.name; | |
1163 | |
1164 g_hash_table_remove(buddy_presences, &key); | |
1165 | |
1166 g_free(presence->u.buddy.name); | 1142 g_free(presence->u.buddy.name); |
1167 } | 1143 } |
1168 else if (purple_presence_get_context(presence) == PURPLE_PRESENCE_CONTEXT_CONV) | 1144 else if (purple_presence_get_context(presence) == PURPLE_PRESENCE_CONTEXT_CONV) |
1169 { | 1145 { |
1170 g_free(presence->u.chat.user); | 1146 g_free(presence->u.chat.user); |
1635 gconstpointer value, gpointer data) | 1611 gconstpointer value, gpointer data) |
1636 { | 1612 { |
1637 int index = GPOINTER_TO_INT(data); | 1613 int index = GPOINTER_TO_INT(data); |
1638 | 1614 |
1639 primitive_scores[index] = GPOINTER_TO_INT(value); | 1615 primitive_scores[index] = GPOINTER_TO_INT(value); |
1640 } | |
1641 | |
1642 static guint | |
1643 purple_buddy_presences_hash(gconstpointer key) | |
1644 { | |
1645 const PurpleStatusBuddyKey *me = key; | |
1646 guint ret; | |
1647 char *str; | |
1648 | |
1649 str = g_strdup_printf("%p%s", me->account, me->name); | |
1650 ret = g_str_hash(str); | |
1651 g_free(str); | |
1652 | |
1653 return ret; | |
1654 } | |
1655 | |
1656 static gboolean | |
1657 purple_buddy_presences_equal(gconstpointer a, gconstpointer b) | |
1658 { | |
1659 PurpleStatusBuddyKey *key_a = (PurpleStatusBuddyKey *)a; | |
1660 PurpleStatusBuddyKey *key_b = (PurpleStatusBuddyKey *)b; | |
1661 | |
1662 if(key_a->account == key_b->account && | |
1663 !strcmp(key_a->name, key_b->name)) | |
1664 return TRUE; | |
1665 else | |
1666 return FALSE; | |
1667 } | |
1668 | |
1669 static void | |
1670 purple_buddy_presences_key_free(gpointer a) | |
1671 { | |
1672 PurpleStatusBuddyKey *key = (PurpleStatusBuddyKey *)a; | |
1673 g_free(key->name); | |
1674 g_free(key); | |
1675 } | 1616 } |
1676 | 1617 |
1677 void * | 1618 void * |
1678 purple_status_get_handle(void) { | 1619 purple_status_get_handle(void) { |
1679 static int handle; | 1620 static int handle; |
1723 score_pref_changed_cb, | 1664 score_pref_changed_cb, |
1724 GINT_TO_POINTER(SCORE_IDLE)); | 1665 GINT_TO_POINTER(SCORE_IDLE)); |
1725 purple_prefs_connect_callback(handle, "/purple/status/scores/offline_msg", | 1666 purple_prefs_connect_callback(handle, "/purple/status/scores/offline_msg", |
1726 score_pref_changed_cb, | 1667 score_pref_changed_cb, |
1727 GINT_TO_POINTER(SCORE_OFFLINE_MESSAGE)); | 1668 GINT_TO_POINTER(SCORE_OFFLINE_MESSAGE)); |
1728 | |
1729 buddy_presences = g_hash_table_new_full(purple_buddy_presences_hash, | |
1730 purple_buddy_presences_equal, | |
1731 purple_buddy_presences_key_free, NULL); | |
1732 } | 1669 } |
1733 | 1670 |
1734 void | 1671 void |
1735 purple_status_uninit(void) | 1672 purple_status_uninit(void) |
1736 { | 1673 { |
1737 if (buddy_presences != NULL) | 1674 } |
1738 { | |
1739 g_hash_table_destroy(buddy_presences); | |
1740 | |
1741 buddy_presences = NULL; | |
1742 } | |
1743 } |