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 }