comparison libpurple/status.c @ 16798: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
16797:cd5d62417d57 16798: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 {