Mercurial > pidgin.yaz
comparison libpurple/status.c @ 16809:c4460fa22886
Change some of the PurplePresence stuff to reflect how it's actually used
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Thu, 03 May 2007 06:32:42 +0000 |
parents | d29c995c815b |
children | 49cc59b2490e |
comparison
equal
deleted
inserted
replaced
16808:cd5d62417d57 | 16809:c4460fa22886 |
---|---|
89 | 89 |
90 struct | 90 struct |
91 { | 91 { |
92 PurpleAccount *account; | 92 PurpleAccount *account; |
93 char *name; | 93 char *name; |
94 size_t ref_count; | 94 PurpleBuddy *buddy; |
95 GList *buddies; | |
96 | 95 |
97 } buddy; | 96 } buddy; |
98 | 97 |
99 } u; | 98 } u; |
100 }; | 99 }; |
129 -50, /* invisible */ | 128 -50, /* invisible */ |
130 -100, /* away */ | 129 -100, /* away */ |
131 -200, /* extended away */ | 130 -200, /* extended away */ |
132 -400, /* mobile */ | 131 -400, /* mobile */ |
133 -10, /* idle, special case. */ | 132 -10, /* idle, special case. */ |
134 -5 /* idle time, special case. */ | 133 -5, /* idle time, special case. */ |
134 10 /* Offline messageable */ | |
135 }; | 135 }; |
136 | 136 |
137 static GHashTable *buddy_presences = NULL; | 137 static GHashTable *buddy_presences = NULL; |
138 | 138 |
139 #define SCORE_IDLE 8 | 139 #define SCORE_IDLE 8 |
656 ops->status_changed(account, new_status); | 656 ops->status_changed(account, new_status); |
657 } | 657 } |
658 } | 658 } |
659 else if (context == PURPLE_PRESENCE_CONTEXT_BUDDY) | 659 else if (context == PURPLE_PRESENCE_CONTEXT_BUDDY) |
660 { | 660 { |
661 const GList *l; | 661 notify_buddy_status_update(purple_presence_get_buddy(presence), presence, |
662 | |
663 for (l = purple_presence_get_buddies(presence); l != NULL; l = l->next) | |
664 { | |
665 notify_buddy_status_update((PurpleBuddy *)l->data, presence, | |
666 old_status, new_status); | 662 old_status, new_status); |
667 } | |
668 } | 663 } |
669 } | 664 } |
670 | 665 |
671 static void | 666 static void |
672 status_has_changed(PurpleStatus *status) | 667 status_has_changed(PurpleStatus *status) |
1146 else | 1141 else |
1147 { | 1142 { |
1148 g_free(key->name); | 1143 g_free(key->name); |
1149 g_free(key); | 1144 g_free(key); |
1150 } | 1145 } |
1151 | 1146 presence->u.buddy.buddy = buddy; |
1152 presence->u.buddy.ref_count++; | |
1153 presence->u.buddy.buddies = g_list_append(presence->u.buddy.buddies, | |
1154 buddy); | |
1155 | 1147 |
1156 return presence; | 1148 return presence; |
1157 } | 1149 } |
1158 | 1150 |
1159 void | 1151 void |
1162 g_return_if_fail(presence != NULL); | 1154 g_return_if_fail(presence != NULL); |
1163 | 1155 |
1164 if (purple_presence_get_context(presence) == PURPLE_PRESENCE_CONTEXT_BUDDY) | 1156 if (purple_presence_get_context(presence) == PURPLE_PRESENCE_CONTEXT_BUDDY) |
1165 { | 1157 { |
1166 PurpleStatusBuddyKey key; | 1158 PurpleStatusBuddyKey key; |
1167 | |
1168 if(presence->u.buddy.ref_count != 0) | |
1169 return; | |
1170 | 1159 |
1171 key.account = presence->u.buddy.account; | 1160 key.account = presence->u.buddy.account; |
1172 key.name = presence->u.buddy.name; | 1161 key.name = presence->u.buddy.name; |
1173 | 1162 |
1174 g_hash_table_remove(buddy_presences, &key); | 1163 g_hash_table_remove(buddy_presences, &key); |
1185 | 1174 |
1186 g_hash_table_destroy(presence->status_table); | 1175 g_hash_table_destroy(presence->status_table); |
1187 | 1176 |
1188 PURPLE_DBUS_UNREGISTER_POINTER(presence); | 1177 PURPLE_DBUS_UNREGISTER_POINTER(presence); |
1189 g_free(presence); | 1178 g_free(presence); |
1190 } | |
1191 | |
1192 /* | |
1193 * TODO: Maybe we should cal purple_presence_destroy() after we | |
1194 * decrement the ref count? I don't see why we should | |
1195 * make other places do it manually when we can do it here. | |
1196 */ | |
1197 void | |
1198 purple_presence_remove_buddy(PurplePresence *presence, PurpleBuddy *buddy) | |
1199 { | |
1200 g_return_if_fail(presence != NULL); | |
1201 g_return_if_fail(buddy != NULL); | |
1202 g_return_if_fail(purple_presence_get_context(presence) == | |
1203 PURPLE_PRESENCE_CONTEXT_BUDDY); | |
1204 | |
1205 if (g_list_find(presence->u.buddy.buddies, buddy) != NULL) | |
1206 { | |
1207 presence->u.buddy.buddies = g_list_remove(presence->u.buddy.buddies, | |
1208 buddy); | |
1209 presence->u.buddy.ref_count--; | |
1210 } | |
1211 } | 1179 } |
1212 | 1180 |
1213 void | 1181 void |
1214 purple_presence_add_status(PurplePresence *presence, PurpleStatus *status) | 1182 purple_presence_add_status(PurplePresence *presence, PurpleStatus *status) |
1215 { | 1183 { |
1343 if (purple_presence_get_context(presence) == PURPLE_PRESENCE_CONTEXT_BUDDY) | 1311 if (purple_presence_get_context(presence) == PURPLE_PRESENCE_CONTEXT_BUDDY) |
1344 { | 1312 { |
1345 const GList *l; | 1313 const GList *l; |
1346 time_t current_time = time(NULL); | 1314 time_t current_time = time(NULL); |
1347 | 1315 |
1348 for (l = purple_presence_get_buddies(presence); l != NULL; l = l->next) | 1316 update_buddy_idle(purple_presence_get_buddy(presence), presence, current_time, |
1349 { | 1317 old_idle, idle); |
1350 update_buddy_idle((PurpleBuddy *)l->data, presence, current_time, | |
1351 old_idle, idle); | |
1352 } | |
1353 } | 1318 } |
1354 else if(purple_presence_get_context(presence) == PURPLE_PRESENCE_CONTEXT_ACCOUNT) | 1319 else if(purple_presence_get_context(presence) == PURPLE_PRESENCE_CONTEXT_ACCOUNT) |
1355 { | 1320 { |
1356 PurpleAccount *account; | 1321 PurpleAccount *account; |
1357 PurpleConnection *gc; | 1322 PurpleConnection *gc; |
1441 PURPLE_PRESENCE_CONTEXT_CONV, NULL); | 1406 PURPLE_PRESENCE_CONTEXT_CONV, NULL); |
1442 | 1407 |
1443 return presence->u.chat.user; | 1408 return presence->u.chat.user; |
1444 } | 1409 } |
1445 | 1410 |
1446 const GList * | 1411 PurpleBuddy * |
1447 purple_presence_get_buddies(const PurplePresence *presence) | 1412 purple_presence_get_buddy(const PurplePresence *presence) |
1448 { | 1413 { |
1449 g_return_val_if_fail(presence != NULL, NULL); | 1414 g_return_val_if_fail(presence != NULL, NULL); |
1450 g_return_val_if_fail(purple_presence_get_context(presence) == | 1415 g_return_val_if_fail(purple_presence_get_context(presence) == |
1451 PURPLE_PRESENCE_CONTEXT_BUDDY, NULL); | 1416 PURPLE_PRESENCE_CONTEXT_BUDDY, NULL); |
1452 | 1417 |
1453 return presence->u.buddy.buddies; | 1418 return presence->u.buddy.buddy; |
1454 } | 1419 } |
1455 | 1420 |
1456 const GList * | 1421 const GList * |
1457 purple_presence_get_statuses(const PurplePresence *presence) | 1422 purple_presence_get_statuses(const PurplePresence *presence) |
1458 { | 1423 { |