| 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 } |
|