Mercurial > pidgin.yaz
annotate src/status.c @ 11638:3a05b53a589e
[gaim-migrate @ 13914]
Some bits'n'pieces:
A bunch of memory leak fixes
Fix newly created accounts to connect in the currently active global
status
Fix the modify account dialog to only show relevant user options etc.
Update sametime to use some more of the new status stuff, it still
needs more love though.
Some s/online/available/ for consistency across prpls
Fix a racyness in disconnecting connections that want to die (fixes
the Yahoo crash when signing on somewhere else)
Sorry if I caused any conflicts!
committer: Tailor Script <tailor@pidgin.im>
author | Stu Tomlinson <stu@nosnilmot.com> |
---|---|
date | Mon, 10 Oct 2005 17:59:48 +0000 |
parents | c7305c2d650b |
children | bf6ba37db13b |
rev | line source |
---|---|
9944 | 1 /** |
10067 | 2 * @file status.c Status API |
9944 | 3 * @ingroup core |
4 * | |
6065 | 5 * gaim |
6 * | |
8046 | 7 * Gaim is the legal property of its developers, whose names are too numerous |
8 * to list here. Please refer to the COPYRIGHT file distributed with this | |
9 * source distribution. | |
9944 | 10 * |
6065 | 11 * This program is free software; you can redistribute it and/or modify |
12 * it under the terms of the GNU General Public License as published by | |
13 * the Free Software Foundation; either version 2 of the License, or | |
14 * (at your option) any later version. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
24 */ | |
9949 | 25 #include "internal.h" |
6065 | 26 |
9949 | 27 #include "blist.h" |
10400 | 28 #include "core.h" |
11187 | 29 #include "dbus-maybe.h" |
9949 | 30 #include "debug.h" |
10337 | 31 #include "notify.h" |
9949 | 32 #include "prefs.h" |
6065 | 33 #include "status.h" |
34 | |
9949 | 35 /** |
36 * A type of status. | |
37 */ | |
38 struct _GaimStatusType | |
39 { | |
40 GaimStatusPrimitive primitive; | |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6321
diff
changeset
|
41 |
9949 | 42 char *id; |
43 char *name; | |
44 char *primary_attr_id; | |
45 | |
46 gboolean saveable; | |
47 gboolean user_settable; | |
48 gboolean independent; | |
49 | |
50 GList *attrs; | |
51 }; | |
6371
8f94cce8faa5
[gaim-migrate @ 6876]
Christian Hammond <chipx86@chipx86.com>
parents:
6321
diff
changeset
|
52 |
9949 | 53 /** |
54 * A status attribute. | |
55 */ | |
56 struct _GaimStatusAttr | |
57 { | |
58 char *id; | |
59 char *name; | |
60 GaimValue *value_type; | |
61 }; | |
6065 | 62 |
9949 | 63 /** |
64 * A list of statuses. | |
65 */ | |
66 struct _GaimPresence | |
67 { | |
68 GaimPresenceContext context; | |
69 | |
70 gboolean idle; | |
71 time_t idle_time; | |
11249 | 72 time_t login_time; |
9949 | 73 |
74 GList *statuses; | |
75 GHashTable *status_table; | |
76 | |
77 GaimStatus *active_status; | |
6065 | 78 |
9949 | 79 union |
80 { | |
81 GaimAccount *account; | |
82 | |
83 struct | |
84 { | |
85 GaimConversation *conv; | |
86 char *user; | |
87 | |
88 } chat; | |
6065 | 89 |
9949 | 90 struct |
91 { | |
92 GaimAccount *account; | |
93 char *name; | |
94 size_t ref_count; | |
95 GList *buddies; | |
96 | |
97 } buddy; | |
98 | |
99 } u; | |
100 }; | |
101 | |
102 /** | |
103 * An active status. | |
104 */ | |
105 struct _GaimStatus | |
6065 | 106 { |
9949 | 107 GaimStatusType *type; |
108 GaimPresence *presence; | |
109 | |
110 const char *title; | |
6065 | 111 |
9949 | 112 gboolean active; |
6065 | 113 |
9949 | 114 GHashTable *attr_values; |
115 }; | |
6065 | 116 |
117 typedef struct | |
118 { | |
9949 | 119 GaimAccount *account; |
120 char *name; | |
121 } GaimStatusBuddyKey; | |
122 | |
123 static int primitive_scores[] = | |
124 { | |
125 0, /* unset */ | |
126 -500, /* offline */ | |
127 0, /* online */ | |
128 100, /* available */ | |
129 -75, /* unavailable */ | |
130 -50, /* hidden */ | |
131 -100, /* away */ | |
10860 | 132 -200, /* extended away */ |
9949 | 133 -10, /* idle, special case. */ |
134 -5 /* idle time, special case. */ | |
135 }; | |
136 | |
137 static GHashTable *buddy_presences = NULL; | |
138 | |
10860 | 139 #define SCORE_IDLE 8 |
140 #define SCORE_IDLE_TIME 9 | |
9949 | 141 |
142 /************************************************************************** | |
10419 | 143 * GaimStatusPrimitive API |
144 **************************************************************************/ | |
145 static struct GaimStatusPrimitiveMap | |
146 { | |
147 GaimStatusPrimitive type; | |
148 const char *id; | |
149 const char *name; | |
150 | |
151 } const status_primitive_map[] = | |
152 { | |
153 { GAIM_STATUS_UNSET, "unset", N_("Unset") }, | |
154 { GAIM_STATUS_OFFLINE, "offline", N_("Offline") }, | |
155 { GAIM_STATUS_AVAILABLE, "available", N_("Available") }, | |
156 { GAIM_STATUS_UNAVAILABLE, "unavailable", N_("Unavailable") }, | |
157 { GAIM_STATUS_HIDDEN, "hidden", N_("Hidden") }, | |
158 { GAIM_STATUS_AWAY, "away", N_("Away") }, | |
159 { GAIM_STATUS_EXTENDED_AWAY, "extended_away", N_("Extended Away") } | |
160 }; | |
161 | |
162 const char * | |
163 gaim_primitive_get_id_from_type(GaimStatusPrimitive type) | |
164 { | |
165 int i; | |
166 | |
167 for (i = 0; i < GAIM_STATUS_NUM_PRIMITIVES; i++) | |
168 { | |
169 if (type == status_primitive_map[i].type) | |
170 return status_primitive_map[i].id; | |
171 } | |
172 | |
173 return status_primitive_map[0].id; | |
174 } | |
175 | |
176 const char * | |
177 gaim_primitive_get_name_from_type(GaimStatusPrimitive type) | |
178 { | |
179 int i; | |
180 | |
181 for (i = 0; i < GAIM_STATUS_NUM_PRIMITIVES; i++) | |
182 { | |
183 if (type == status_primitive_map[i].type) | |
184 return status_primitive_map[i].name; | |
185 } | |
186 | |
187 return status_primitive_map[0].name; | |
188 } | |
189 | |
190 GaimStatusPrimitive | |
191 gaim_primitive_get_type_from_id(const char *id) | |
192 { | |
193 int i; | |
194 | |
195 g_return_val_if_fail(id != NULL, GAIM_STATUS_UNSET); | |
196 | |
197 for (i = 0; i < GAIM_STATUS_NUM_PRIMITIVES; i++) | |
198 { | |
199 if (!strcmp(id, status_primitive_map[i].id)) | |
200 return status_primitive_map[i].type; | |
201 } | |
202 | |
203 return status_primitive_map[0].type; | |
204 } | |
205 | |
206 | |
207 /************************************************************************** | |
9949 | 208 * GaimStatusType API |
209 **************************************************************************/ | |
210 GaimStatusType * | |
211 gaim_status_type_new_full(GaimStatusPrimitive primitive, const char *id, | |
10009 | 212 const char *name, gboolean saveable, |
213 gboolean user_settable, gboolean independent) | |
9949 | 214 { |
215 GaimStatusType *status_type; | |
216 | |
217 g_return_val_if_fail(primitive != GAIM_STATUS_UNSET, NULL); | |
218 g_return_val_if_fail(id != NULL, NULL); | |
219 g_return_val_if_fail(name != NULL, NULL); | |
220 | |
221 status_type = g_new0(GaimStatusType, 1); | |
11187 | 222 GAIM_DBUS_REGISTER_POINTER(status_type, GaimStatusType); |
9949 | 223 |
224 status_type->primitive = primitive; | |
225 status_type->id = g_strdup(id); | |
226 status_type->name = g_strdup(name); | |
227 status_type->saveable = saveable; | |
228 status_type->user_settable = user_settable; | |
229 status_type->independent = independent; | |
230 | |
231 return status_type; | |
232 } | |
233 | |
234 GaimStatusType * | |
235 gaim_status_type_new(GaimStatusPrimitive primitive, const char *id, | |
10009 | 236 const char *name, gboolean user_settable) |
9949 | 237 { |
238 g_return_val_if_fail(primitive != GAIM_STATUS_UNSET, NULL); | |
239 g_return_val_if_fail(id != NULL, NULL); | |
240 g_return_val_if_fail(name != NULL, NULL); | |
241 | |
242 return gaim_status_type_new_full(primitive, id, name, FALSE, | |
243 user_settable, FALSE); | |
244 } | |
245 | |
246 GaimStatusType * | |
247 gaim_status_type_new_with_attrs(GaimStatusPrimitive primitive, | |
248 const char *id, const char *name, | |
249 gboolean saveable, gboolean user_settable, | |
250 gboolean independent, const char *attr_id, | |
251 const char *attr_name, GaimValue *attr_value, | |
252 ...) | |
253 { | |
254 GaimStatusType *status_type; | |
255 va_list args; | |
256 | |
257 g_return_val_if_fail(primitive != GAIM_STATUS_UNSET, NULL); | |
258 g_return_val_if_fail(id != NULL, NULL); | |
259 g_return_val_if_fail(name != NULL, NULL); | |
10012 | 260 g_return_val_if_fail(attr_id != NULL, NULL); |
9949 | 261 g_return_val_if_fail(attr_name != NULL, NULL); |
262 g_return_val_if_fail(attr_value != NULL, NULL); | |
263 | |
264 status_type = gaim_status_type_new_full(primitive, id, name, saveable, | |
265 user_settable, independent); | |
266 | |
10010 | 267 /* Add the first attribute */ |
9949 | 268 gaim_status_type_add_attr(status_type, attr_id, attr_name, attr_value); |
269 | |
270 va_start(args, attr_value); | |
271 gaim_status_type_add_attrs_vargs(status_type, args); | |
272 va_end(args); | |
273 | |
274 return status_type; | |
275 } | |
276 | |
277 void | |
278 gaim_status_type_destroy(GaimStatusType *status_type) | |
279 { | |
280 GList *l; | |
281 | |
282 g_return_if_fail(status_type != NULL); | |
283 | |
284 g_free(status_type->id); | |
285 g_free(status_type->name); | |
286 | |
287 if (status_type->primary_attr_id != NULL) | |
288 g_free(status_type->primary_attr_id); | |
289 | |
290 if (status_type->attrs != NULL) | |
291 { | |
292 for (l = status_type->attrs; l != NULL; l = l->next) | |
293 gaim_status_attr_destroy((GaimStatusAttr *)l->data); | |
294 | |
295 g_list_free(status_type->attrs); | |
296 } | |
297 | |
11187 | 298 GAIM_DBUS_UNREGISTER_POINTER(status_type); |
9949 | 299 g_free(status_type); |
300 } | |
301 | |
302 void | |
303 gaim_status_type_set_primary_attr(GaimStatusType *status_type, const char *id) | |
304 { | |
305 g_return_if_fail(status_type != NULL); | |
306 | |
307 if (status_type->primary_attr_id != NULL) | |
308 g_free(status_type->primary_attr_id); | |
309 | |
310 status_type->primary_attr_id = (id == NULL ? NULL : g_strdup(id)); | |
311 } | |
312 | |
313 void | |
10197 | 314 gaim_status_type_add_attr(GaimStatusType *status_type, const char *id, |
9949 | 315 const char *name, GaimValue *value) |
316 { | |
317 GaimStatusAttr *attr; | |
318 | |
319 g_return_if_fail(status_type != NULL); | |
320 g_return_if_fail(id != NULL); | |
321 g_return_if_fail(name != NULL); | |
322 g_return_if_fail(value != NULL); | |
323 | |
324 attr = gaim_status_attr_new(id, name, value); | |
325 | |
326 status_type->attrs = g_list_append(status_type->attrs, attr); | |
327 } | |
328 | |
329 void | |
330 gaim_status_type_add_attrs_vargs(GaimStatusType *status_type, va_list args) | |
331 { | |
332 const char *id, *name; | |
333 GaimValue *value; | |
334 | |
335 g_return_if_fail(status_type != NULL); | |
336 | |
337 while ((id = va_arg(args, const char *)) != NULL) | |
338 { | |
339 name = va_arg(args, const char *); | |
340 g_return_if_fail(name != NULL); | |
341 | |
342 value = va_arg(args, GaimValue *); | |
343 g_return_if_fail(value != NULL); | |
6065 | 344 |
9949 | 345 gaim_status_type_add_attr(status_type, id, name, value); |
346 } | |
347 } | |
348 | |
10010 | 349 void |
350 gaim_status_type_add_attrs(GaimStatusType *status_type, const char *id, | |
351 const char *name, GaimValue *value, ...) | |
352 { | |
353 va_list args; | |
354 | |
355 g_return_if_fail(status_type != NULL); | |
356 g_return_if_fail(id != NULL); | |
357 g_return_if_fail(name != NULL); | |
358 g_return_if_fail(value != NULL); | |
359 | |
360 /* Add the first attribute */ | |
361 gaim_status_type_add_attr(status_type, id, name, value); | |
362 | |
363 va_start(args, value); | |
364 gaim_status_type_add_attrs_vargs(status_type, args); | |
365 va_end(args); | |
366 } | |
367 | |
9949 | 368 GaimStatusPrimitive |
369 gaim_status_type_get_primitive(const GaimStatusType *status_type) | |
370 { | |
371 g_return_val_if_fail(status_type != NULL, GAIM_STATUS_UNSET); | |
372 | |
373 return status_type->primitive; | |
374 } | |
375 | |
376 const char * | |
377 gaim_status_type_get_id(const GaimStatusType *status_type) | |
378 { | |
379 g_return_val_if_fail(status_type != NULL, NULL); | |
380 | |
381 return status_type->id; | |
382 } | |
383 | |
384 const char * | |
385 gaim_status_type_get_name(const GaimStatusType *status_type) | |
386 { | |
387 g_return_val_if_fail(status_type != NULL, NULL); | |
388 | |
389 return status_type->name; | |
390 } | |
391 | |
392 gboolean | |
393 gaim_status_type_is_saveable(const GaimStatusType *status_type) | |
394 { | |
395 g_return_val_if_fail(status_type != NULL, FALSE); | |
396 | |
397 return status_type->saveable; | |
398 } | |
399 | |
400 gboolean | |
401 gaim_status_type_is_user_settable(const GaimStatusType *status_type) | |
402 { | |
403 g_return_val_if_fail(status_type != NULL, FALSE); | |
404 | |
405 return status_type->user_settable; | |
406 } | |
407 | |
408 gboolean | |
409 gaim_status_type_is_independent(const GaimStatusType *status_type) | |
410 { | |
411 g_return_val_if_fail(status_type != NULL, FALSE); | |
412 | |
413 return status_type->independent; | |
414 } | |
415 | |
416 gboolean | |
10067 | 417 gaim_status_type_is_exclusive(const GaimStatusType *status_type) |
418 { | |
419 g_return_val_if_fail(status_type != NULL, FALSE); | |
420 | |
421 return !status_type->independent; | |
422 } | |
423 | |
424 gboolean | |
9949 | 425 gaim_status_type_is_available(const GaimStatusType *status_type) |
426 { | |
427 GaimStatusPrimitive primitive; | |
428 | |
429 g_return_val_if_fail(status_type != NULL, FALSE); | |
430 | |
431 primitive = gaim_status_type_get_primitive(status_type); | |
432 | |
10500 | 433 /* Why does "hidden" mean the person is available? */ |
9949 | 434 return (primitive == GAIM_STATUS_AVAILABLE || |
435 primitive == GAIM_STATUS_HIDDEN); | |
436 } | |
437 | |
438 const char * | |
439 gaim_status_type_get_primary_attr(const GaimStatusType *status_type) | |
440 { | |
441 g_return_val_if_fail(status_type != NULL, NULL); | |
442 | |
443 return status_type->primary_attr_id; | |
444 } | |
445 | |
446 GaimStatusAttr * | |
447 gaim_status_type_get_attr(const GaimStatusType *status_type, const char *id) | |
448 { | |
449 GList *l; | |
450 | |
451 g_return_val_if_fail(status_type != NULL, NULL); | |
452 g_return_val_if_fail(id != NULL, NULL); | |
453 | |
454 for (l = status_type->attrs; l != NULL; l = l->next) | |
455 { | |
456 GaimStatusAttr *attr = (GaimStatusAttr *)l->data; | |
457 | |
458 if (!strcmp(gaim_status_attr_get_id(attr), id)) | |
459 return attr; | |
460 } | |
461 | |
462 return NULL; | |
463 } | |
464 | |
465 const GList * | |
466 gaim_status_type_get_attrs(const GaimStatusType *status_type) | |
467 { | |
468 g_return_val_if_fail(status_type != NULL, NULL); | |
469 | |
470 return status_type->attrs; | |
471 } | |
472 | |
10348 | 473 const GaimStatusType * |
474 gaim_status_type_find_with_id(GList *status_types, const char *id) | |
475 { | |
476 GaimStatusType *status_type; | |
477 | |
478 g_return_val_if_fail(id != NULL, NULL); | |
479 | |
480 while (status_types != NULL) | |
481 { | |
482 status_type = status_types->data; | |
483 | |
484 if (!strcmp(id, status_type->id)) | |
485 return status_type; | |
10895 | 486 |
487 status_types = status_types->next; | |
10348 | 488 } |
489 | |
490 return NULL; | |
491 } | |
492 | |
9949 | 493 |
494 /************************************************************************** | |
495 * GaimStatusAttr API | |
496 **************************************************************************/ | |
497 GaimStatusAttr * | |
498 gaim_status_attr_new(const char *id, const char *name, GaimValue *value_type) | |
499 { | |
500 GaimStatusAttr *attr; | |
501 | |
502 g_return_val_if_fail(id != NULL, NULL); | |
503 g_return_val_if_fail(name != NULL, NULL); | |
504 g_return_val_if_fail(value_type != NULL, NULL); | |
505 | |
506 attr = g_new0(GaimStatusAttr, 1); | |
11187 | 507 GAIM_DBUS_REGISTER_POINTER(attr, GaimStatusAttr); |
9949 | 508 |
509 attr->id = g_strdup(id); | |
510 attr->name = g_strdup(name); | |
511 attr->value_type = value_type; | |
512 | |
513 return attr; | |
514 } | |
515 | |
516 void | |
517 gaim_status_attr_destroy(GaimStatusAttr *attr) | |
518 { | |
519 g_return_if_fail(attr != NULL); | |
520 | |
521 g_free(attr->id); | |
522 g_free(attr->name); | |
523 | |
524 gaim_value_destroy(attr->value_type); | |
525 | |
11187 | 526 GAIM_DBUS_UNREGISTER_POINTER(attr); |
9949 | 527 g_free(attr); |
528 } | |
529 | |
530 const char * | |
531 gaim_status_attr_get_id(const GaimStatusAttr *attr) | |
532 { | |
533 g_return_val_if_fail(attr != NULL, NULL); | |
534 | |
535 return attr->id; | |
536 } | |
537 | |
538 const char * | |
539 gaim_status_attr_get_name(const GaimStatusAttr *attr) | |
540 { | |
541 g_return_val_if_fail(attr != NULL, NULL); | |
542 | |
543 return attr->name; | |
544 } | |
545 | |
546 GaimValue * | |
11249 | 547 gaim_status_attr_get_value(const GaimStatusAttr *attr) |
9949 | 548 { |
549 g_return_val_if_fail(attr != NULL, NULL); | |
550 | |
551 return attr->value_type; | |
552 } | |
553 | |
554 | |
555 /************************************************************************** | |
556 * GaimStatus API | |
557 **************************************************************************/ | |
558 GaimStatus * | |
559 gaim_status_new(GaimStatusType *status_type, GaimPresence *presence) | |
560 { | |
561 GaimStatus *status; | |
562 const GList *l; | |
563 | |
564 g_return_val_if_fail(status_type != NULL, NULL); | |
565 g_return_val_if_fail(presence != NULL, NULL); | |
566 | |
567 status = g_new0(GaimStatus, 1); | |
11187 | 568 GAIM_DBUS_REGISTER_POINTER(status, GaimStatus); |
9949 | 569 |
570 status->type = status_type; | |
571 status->presence = presence; | |
572 | |
573 status->attr_values = | |
574 g_hash_table_new_full(g_str_hash, g_str_equal, g_free, | |
575 (GDestroyNotify)gaim_value_destroy); | |
576 | |
577 for (l = gaim_status_type_get_attrs(status_type); l != NULL; l = l->next) | |
578 { | |
579 GaimStatusAttr *attr = (GaimStatusAttr *)l->data; | |
11249 | 580 GaimValue *value = gaim_status_attr_get_value(attr); |
9949 | 581 GaimValue *new_value = gaim_value_dup(value); |
582 | |
583 g_hash_table_insert(status->attr_values, | |
10197 | 584 g_strdup(gaim_status_attr_get_id(attr)), |
585 new_value); | |
9949 | 586 } |
587 | |
588 return status; | |
589 } | |
590 | |
10754 | 591 /* |
592 * TODO: If the GaimStatus is in a GaimPresence, then | |
593 * remove it from the GaimPresence? | |
594 */ | |
9949 | 595 void |
596 gaim_status_destroy(GaimStatus *status) | |
597 { | |
598 g_return_if_fail(status != NULL); | |
599 | |
10754 | 600 /* TODO: Don't do this is if the status is exclusive */ |
11638 | 601 /* XXX: why do this at all? |
602 gaim_status_set_active(status, FALSE); */ | |
9949 | 603 |
604 g_hash_table_destroy(status->attr_values); | |
605 | |
11187 | 606 GAIM_DBUS_UNREGISTER_POINTER(status); |
9949 | 607 g_free(status); |
608 } | |
6065 | 609 |
610 static void | |
9949 | 611 notify_buddy_status_update(GaimBuddy *buddy, GaimPresence *presence, |
612 GaimStatus *old_status, GaimStatus *new_status) | |
613 { | |
614 GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); | |
615 | |
616 if (gaim_prefs_get_bool("/core/logging/log_system") && | |
617 gaim_prefs_get_bool("/core/logging/log_away_state")) | |
618 { | |
619 time_t current_time = time(NULL); | |
620 const char *buddy_alias = gaim_buddy_get_alias(buddy); | |
621 char *tmp = NULL; | |
622 | |
11624 | 623 if (((old_status == NULL) || !gaim_status_is_available(old_status)) && |
9949 | 624 gaim_status_is_available(new_status)) |
625 { | |
626 tmp = g_strdup_printf(_("%s came back"), buddy_alias); | |
627 } | |
11624 | 628 else if ((old_status != NULL) && gaim_status_is_available(old_status) && |
9949 | 629 !gaim_status_is_available(new_status)) |
630 { | |
631 tmp = g_strdup_printf(_("%s went away"), buddy_alias); | |
632 } | |
633 | |
634 if (tmp != NULL) | |
635 { | |
636 GaimLog *log = gaim_account_get_log(buddy->account); | |
637 | |
638 gaim_log_write(log, GAIM_MESSAGE_SYSTEM, buddy_alias, | |
639 current_time, tmp); | |
640 g_free(tmp); | |
641 } | |
642 } | |
643 | |
10012 | 644 if (ops != NULL && ops->update != NULL) |
645 ops->update(gaim_get_blist(), (GaimBlistNode*)buddy); | |
9949 | 646 } |
647 | |
648 static void | |
649 notify_status_update(GaimPresence *presence, GaimStatus *old_status, | |
10176
0109f3a518d2
[gaim-migrate @ 11291]
Christian Hammond <chipx86@chipx86.com>
parents:
10153
diff
changeset
|
650 GaimStatus *new_status) |
6065 | 651 { |
9949 | 652 GaimPresenceContext context = gaim_presence_get_context(presence); |
653 | |
654 if (context == GAIM_PRESENCE_CONTEXT_ACCOUNT) | |
655 { | |
10176
0109f3a518d2
[gaim-migrate @ 11291]
Christian Hammond <chipx86@chipx86.com>
parents:
10153
diff
changeset
|
656 GaimAccount *account = gaim_presence_get_account(presence); |
9949 | 657 GaimAccountUiOps *ops = gaim_accounts_get_ui_ops(); |
658 | |
10400 | 659 if (gaim_account_get_enabled(account, gaim_core_get_ui())) |
10447 | 660 gaim_prpl_change_account_status(account, old_status, new_status); |
10176
0109f3a518d2
[gaim-migrate @ 11291]
Christian Hammond <chipx86@chipx86.com>
parents:
10153
diff
changeset
|
661 |
9949 | 662 if (ops != NULL && ops->status_changed != NULL) |
663 { | |
10176
0109f3a518d2
[gaim-migrate @ 11291]
Christian Hammond <chipx86@chipx86.com>
parents:
10153
diff
changeset
|
664 ops->status_changed(account, new_status); |
9949 | 665 } |
666 } | |
667 else if (context == GAIM_PRESENCE_CONTEXT_CONV) | |
668 { | |
669 #if 0 | |
670 GaimConversationUiOps *ops; | |
671 GaimConversation *conv; | |
672 | |
673 conv = gaim_status_get_conversation(new_status); | |
10348 | 674 /* |
675 * TODO: Probably need to do some of the following here? This is copied | |
676 * from some old status code that was removed. | |
677 * | |
678 * char *tmp = g_strdup_printf(_("%s logged in."), alias); | |
679 * gaim_conversation_write(c, NULL, tmp, GAIM_MESSAGE_SYSTEM, time(NULL)); | |
680 * g_free(tmp); | |
681 * | |
682 * char *tmp = g_strdup_printf(_("%s logged out."), alias); | |
683 * gaim_conversation_write(c, NULL, tmp, GAIM_MESSAGE_SYSTEM, time(NULL)); | |
684 * g_free(tmp); | |
685 * | |
686 * char *tmp = g_strdup_printf(_("%s signed off"), alias); | |
687 * gaim_log_write(log, GAIM_MESSAGE_SYSTEM, (alias ? alias : name), current_time, tmp); | |
688 * g_free(tmp); | |
689 * | |
690 * serv_got_typing_stopped(gc, name); | |
691 * | |
692 * gaim_conversation_update(c, GAIM_CONV_UPDATE_AWAY); | |
693 */ | |
9949 | 694 #endif |
695 } | |
696 else if (context == GAIM_PRESENCE_CONTEXT_BUDDY) | |
697 { | |
698 const GList *l; | |
699 | |
700 for (l = gaim_presence_get_buddies(presence); l != NULL; l = l->next) | |
701 { | |
702 notify_buddy_status_update((GaimBuddy *)l->data, presence, | |
703 old_status, new_status); | |
704 } | |
10348 | 705 |
706 /* | |
707 * TODO: Maybe we should do this here? | |
708 * GaimLog *log = gaim_account_get_log(account); | |
709 * char *tmp = g_strdup_printf(_("%s signed on"), alias); | |
710 * gaim_log_write(log, GAIM_MESSAGE_SYSTEM, (alias ? alias : name), current_time, tmp); | |
711 * g_free(tmp); | |
712 */ | |
9949 | 713 } |
714 } | |
715 | |
10204 | 716 static void |
717 status_has_changed(GaimStatus *status) | |
9949 | 718 { |
719 GaimPresence *presence; | |
720 GaimStatus *old_status; | |
721 | |
722 presence = gaim_status_get_presence(status); | |
723 | |
10204 | 724 /* |
725 * If this status is exclusive, then we must be setting it to "active." | |
726 * Since we are setting it to active, we want to set the currently | |
727 * active status to "inactive." | |
728 */ | |
729 if (gaim_status_is_exclusive(status)) | |
9949 | 730 { |
10754 | 731 old_status = gaim_presence_get_active_status(presence); |
10760 | 732 if (old_status != NULL && (old_status != status)) |
10754 | 733 old_status->active = FALSE; |
734 presence->active_status = status; | |
9949 | 735 } |
10754 | 736 else |
737 old_status = NULL; | |
9949 | 738 |
10204 | 739 notify_status_update(presence, old_status, status); |
740 } | |
741 | |
742 void | |
743 gaim_status_set_active(GaimStatus *status, gboolean active) | |
744 { | |
10754 | 745 gaim_status_set_active_with_attrs(status, active, NULL); |
10204 | 746 } |
747 | |
11249 | 748 /* |
749 * This used to parse the va_list directly, but now it creates a GList | |
750 * and passes it to gaim_status_set_active_with_attrs_list(). That | |
751 * function was created because accounts.c needs to pass a GList of | |
752 * attributes to the status API. | |
753 */ | |
10204 | 754 void |
755 gaim_status_set_active_with_attrs(GaimStatus *status, gboolean active, va_list args) | |
756 { | |
11249 | 757 GList *attrs = NULL; |
758 const gchar *id; | |
759 gpointer data; | |
760 | |
761 if (args != NULL) | |
762 { | |
763 while ((id = va_arg(args, const char *)) != NULL) | |
764 { | |
765 attrs = g_list_append(attrs, (char *)id); | |
766 data = va_arg(args, void *); | |
767 attrs = g_list_append(attrs, data); | |
768 } | |
769 } | |
770 gaim_status_set_active_with_attrs_list(status, active, attrs); | |
771 g_list_free(attrs); | |
772 } | |
773 | |
774 void | |
775 gaim_status_set_active_with_attrs_list(GaimStatus *status, gboolean active, | |
776 const GList *attrs) | |
777 { | |
10204 | 778 gboolean changed = FALSE; |
779 const gchar *id; | |
780 | |
10714 | 781 g_return_if_fail(status != NULL); |
782 | |
10204 | 783 if (!active && gaim_status_is_exclusive(status)) |
784 { | |
785 gaim_debug_error("status", | |
786 "Cannot deactivate an exclusive status (%s).\n", | |
787 gaim_status_get_id(status)); | |
788 return; | |
789 } | |
790 | |
791 if (status->active != active) | |
10738 | 792 { |
10204 | 793 changed = TRUE; |
10738 | 794 } |
10204 | 795 |
9949 | 796 status->active = active; |
6065 | 797 |
10204 | 798 /* Set any attributes */ |
11249 | 799 while (attrs) |
10204 | 800 { |
801 GaimValue *value; | |
11249 | 802 |
803 id = attrs->data; | |
804 attrs = attrs->next; | |
10204 | 805 value = gaim_status_get_attr_value(status, id); |
10713 | 806 if (value == NULL) |
807 { | |
808 gaim_debug_warning("status", "The attribute \"%s\" on the status \"%s\" is " | |
10714 | 809 "not supported.\n", id, status->type->name); |
10713 | 810 /* Skip over the data and move on to the next attribute */ |
11249 | 811 attrs = attrs->next; |
10713 | 812 continue; |
813 } | |
814 | |
10204 | 815 if (value->type == GAIM_TYPE_STRING) |
816 { | |
11249 | 817 const gchar *string_data = attrs->data; |
818 attrs = attrs->next; | |
10204 | 819 if (((string_data == NULL) && (value->data.string_data == NULL)) || |
820 ((string_data != NULL) && (value->data.string_data != NULL) && | |
821 !strcmp(string_data, value->data.string_data))) | |
822 { | |
823 continue; | |
824 } | |
825 gaim_status_set_attr_string(status, id, string_data); | |
826 changed = TRUE; | |
827 } | |
828 else if (value->type == GAIM_TYPE_INT) | |
829 { | |
11586 | 830 int int_data = GPOINTER_TO_INT(attrs->data); |
11249 | 831 attrs = attrs->next; |
10204 | 832 if (int_data == value->data.int_data) |
833 continue; | |
834 gaim_status_set_attr_int(status, id, int_data); | |
835 changed = TRUE; | |
836 } | |
837 else if (value->type == GAIM_TYPE_BOOLEAN) | |
838 { | |
11586 | 839 gboolean boolean_data = GPOINTER_TO_INT(attrs->data); |
11249 | 840 attrs = attrs->next; |
10204 | 841 if (boolean_data == value->data.boolean_data) |
842 continue; | |
843 gaim_status_set_attr_int(status, id, boolean_data); | |
844 changed = TRUE; | |
845 } | |
846 else | |
847 { | |
848 /* We don't know what the data is--skip over it */ | |
11249 | 849 attrs = attrs->next; |
10204 | 850 } |
851 } | |
852 | |
853 if (!changed) | |
854 return; | |
855 status_has_changed(status); | |
9949 | 856 } |
857 | |
858 void | |
859 gaim_status_set_attr_boolean(GaimStatus *status, const char *id, | |
860 gboolean value) | |
861 { | |
862 GaimStatusType *status_type; | |
863 GaimValue *attr_value; | |
864 | |
865 g_return_if_fail(status != NULL); | |
866 g_return_if_fail(id != NULL); | |
867 | |
868 status_type = gaim_status_get_type(status); | |
869 | |
10197 | 870 /* Make sure this attribute exists and is the correct type. */ |
871 attr_value = gaim_status_get_attr_value(status, id); | |
872 g_return_if_fail(attr_value != NULL); | |
9949 | 873 g_return_if_fail(gaim_value_get_type(attr_value) == GAIM_TYPE_BOOLEAN); |
874 | |
875 gaim_value_set_boolean(attr_value, value); | |
876 } | |
877 | |
878 void | |
879 gaim_status_set_attr_int(GaimStatus *status, const char *id, int value) | |
880 { | |
881 GaimStatusType *status_type; | |
882 GaimValue *attr_value; | |
883 | |
884 g_return_if_fail(status != NULL); | |
885 g_return_if_fail(id != NULL); | |
886 | |
887 status_type = gaim_status_get_type(status); | |
888 | |
10197 | 889 /* Make sure this attribute exists and is the correct type. */ |
890 attr_value = gaim_status_get_attr_value(status, id); | |
891 g_return_if_fail(attr_value != NULL); | |
9949 | 892 g_return_if_fail(gaim_value_get_type(attr_value) == GAIM_TYPE_INT); |
893 | |
894 gaim_value_set_int(attr_value, value); | |
6065 | 895 } |
896 | |
9949 | 897 void |
898 gaim_status_set_attr_string(GaimStatus *status, const char *id, | |
899 const char *value) | |
900 { | |
901 GaimStatusType *status_type; | |
902 GaimValue *attr_value; | |
903 | |
904 g_return_if_fail(status != NULL); | |
905 g_return_if_fail(id != NULL); | |
906 | |
907 status_type = gaim_status_get_type(status); | |
908 | |
10197 | 909 /* Make sure this attribute exists and is the correct type. */ |
10196 | 910 attr_value = gaim_status_get_attr_value(status, id); |
10197 | 911 g_return_if_fail(attr_value != NULL); |
9949 | 912 g_return_if_fail(gaim_value_get_type(attr_value) == GAIM_TYPE_STRING); |
913 | |
914 gaim_value_set_string(attr_value, value); | |
915 } | |
916 | |
917 GaimStatusType * | |
918 gaim_status_get_type(const GaimStatus *status) | |
919 { | |
920 g_return_val_if_fail(status != NULL, NULL); | |
921 | |
922 return status->type; | |
923 } | |
924 | |
925 GaimPresence * | |
926 gaim_status_get_presence(const GaimStatus *status) | |
6065 | 927 { |
9949 | 928 g_return_val_if_fail(status != NULL, NULL); |
929 | |
930 return status->presence; | |
931 } | |
932 | |
933 const char * | |
934 gaim_status_get_id(const GaimStatus *status) | |
935 { | |
936 g_return_val_if_fail(status != NULL, NULL); | |
937 | |
938 return gaim_status_type_get_id(gaim_status_get_type(status)); | |
939 } | |
940 | |
941 const char * | |
942 gaim_status_get_name(const GaimStatus *status) | |
943 { | |
944 g_return_val_if_fail(status != NULL, NULL); | |
945 | |
946 return gaim_status_type_get_name(gaim_status_get_type(status)); | |
947 } | |
948 | |
949 gboolean | |
950 gaim_status_is_independent(const GaimStatus *status) | |
951 { | |
952 g_return_val_if_fail(status != NULL, FALSE); | |
953 | |
954 return gaim_status_type_is_independent(gaim_status_get_type(status)); | |
955 } | |
956 | |
957 gboolean | |
10067 | 958 gaim_status_is_exclusive(const GaimStatus *status) |
959 { | |
960 g_return_val_if_fail(status != NULL, FALSE); | |
961 | |
962 return gaim_status_type_is_exclusive(gaim_status_get_type(status)); | |
963 } | |
964 | |
965 gboolean | |
9949 | 966 gaim_status_is_available(const GaimStatus *status) |
967 { | |
968 g_return_val_if_fail(status != NULL, FALSE); | |
969 | |
970 return gaim_status_type_is_available(gaim_status_get_type(status)); | |
971 } | |
6216 | 972 |
9949 | 973 gboolean |
974 gaim_status_is_active(const GaimStatus *status) | |
975 { | |
976 g_return_val_if_fail(status != NULL, FALSE); | |
977 | |
978 return status->active; | |
979 } | |
980 | |
10040
81059dce3aed
[gaim-migrate @ 10999]
Luke Schierer <lschiere@pidgin.im>
parents:
10013
diff
changeset
|
981 gboolean |
81059dce3aed
[gaim-migrate @ 10999]
Luke Schierer <lschiere@pidgin.im>
parents:
10013
diff
changeset
|
982 gaim_status_is_online(const GaimStatus *status) |
81059dce3aed
[gaim-migrate @ 10999]
Luke Schierer <lschiere@pidgin.im>
parents:
10013
diff
changeset
|
983 { |
81059dce3aed
[gaim-migrate @ 10999]
Luke Schierer <lschiere@pidgin.im>
parents:
10013
diff
changeset
|
984 GaimStatusPrimitive primitive; |
81059dce3aed
[gaim-migrate @ 10999]
Luke Schierer <lschiere@pidgin.im>
parents:
10013
diff
changeset
|
985 |
81059dce3aed
[gaim-migrate @ 10999]
Luke Schierer <lschiere@pidgin.im>
parents:
10013
diff
changeset
|
986 g_return_val_if_fail( status != NULL, FALSE); |
81059dce3aed
[gaim-migrate @ 10999]
Luke Schierer <lschiere@pidgin.im>
parents:
10013
diff
changeset
|
987 |
81059dce3aed
[gaim-migrate @ 10999]
Luke Schierer <lschiere@pidgin.im>
parents:
10013
diff
changeset
|
988 primitive = gaim_status_type_get_primitive(gaim_status_get_type(status)); |
81059dce3aed
[gaim-migrate @ 10999]
Luke Schierer <lschiere@pidgin.im>
parents:
10013
diff
changeset
|
989 |
81059dce3aed
[gaim-migrate @ 10999]
Luke Schierer <lschiere@pidgin.im>
parents:
10013
diff
changeset
|
990 return (primitive != GAIM_STATUS_UNSET && |
81059dce3aed
[gaim-migrate @ 10999]
Luke Schierer <lschiere@pidgin.im>
parents:
10013
diff
changeset
|
991 primitive != GAIM_STATUS_OFFLINE); |
81059dce3aed
[gaim-migrate @ 10999]
Luke Schierer <lschiere@pidgin.im>
parents:
10013
diff
changeset
|
992 } |
81059dce3aed
[gaim-migrate @ 10999]
Luke Schierer <lschiere@pidgin.im>
parents:
10013
diff
changeset
|
993 |
9949 | 994 GaimValue * |
995 gaim_status_get_attr_value(const GaimStatus *status, const char *id) | |
996 { | |
997 GaimStatusType *status_type; | |
998 GaimStatusAttr *attr; | |
999 | |
1000 g_return_val_if_fail(status != NULL, NULL); | |
1001 g_return_val_if_fail(id != NULL, NULL); | |
1002 | |
1003 status_type = gaim_status_get_type(status); | |
1004 | |
1005 /* Make sure this attribute exists. */ | |
1006 attr = gaim_status_type_get_attr(status_type, id); | |
1007 g_return_val_if_fail(attr != NULL, NULL); | |
1008 | |
1009 return (GaimValue *)g_hash_table_lookup(status->attr_values, id); | |
1010 } | |
1011 | |
1012 gboolean | |
1013 gaim_status_get_attr_boolean(const GaimStatus *status, const char *id) | |
1014 { | |
1015 const GaimValue *value; | |
1016 | |
1017 g_return_val_if_fail(status != NULL, FALSE); | |
1018 g_return_val_if_fail(id != NULL, FALSE); | |
1019 | |
1020 if ((value = gaim_status_get_attr_value(status, id)) == NULL) | |
1021 return FALSE; | |
1022 | |
10197 | 1023 g_return_val_if_fail(gaim_value_get_type(value) == GAIM_TYPE_BOOLEAN, FALSE); |
9949 | 1024 |
1025 return gaim_value_get_boolean(value); | |
1026 } | |
1027 | |
1028 int | |
1029 gaim_status_get_attr_int(const GaimStatus *status, const char *id) | |
1030 { | |
1031 const GaimValue *value; | |
1032 | |
10507 | 1033 g_return_val_if_fail(status != NULL, 0); |
1034 g_return_val_if_fail(id != NULL, 0); | |
9949 | 1035 |
1036 if ((value = gaim_status_get_attr_value(status, id)) == NULL) | |
10507 | 1037 return 0; |
9949 | 1038 |
1039 g_return_val_if_fail(gaim_value_get_type(value) == GAIM_TYPE_INT, 0); | |
1040 | |
1041 return gaim_value_get_int(value); | |
1042 } | |
1043 | |
1044 const char * | |
1045 gaim_status_get_attr_string(const GaimStatus *status, const char *id) | |
1046 { | |
1047 const GaimValue *value; | |
1048 | |
10507 | 1049 g_return_val_if_fail(status != NULL, NULL); |
1050 g_return_val_if_fail(id != NULL, NULL); | |
9949 | 1051 |
1052 if ((value = gaim_status_get_attr_value(status, id)) == NULL) | |
10504 | 1053 return NULL; |
9949 | 1054 |
1055 g_return_val_if_fail(gaim_value_get_type(value) == GAIM_TYPE_STRING, NULL); | |
1056 | |
1057 return gaim_value_get_string(value); | |
1058 } | |
1059 | |
1060 gint | |
1061 gaim_status_compare(const GaimStatus *status1, const GaimStatus *status2) | |
1062 { | |
1063 GaimStatusType *type1, *type2; | |
1064 int score1 = 0, score2 = 0; | |
6065 | 1065 |
9949 | 1066 if ((status1 == NULL && status2 == NULL) || |
1067 (status1 == status2)) | |
1068 { | |
1069 return 0; | |
1070 } | |
1071 else if (status1 == NULL) | |
1072 return 1; | |
1073 else if (status2 == NULL) | |
1074 return -1; | |
1075 | |
1076 type1 = gaim_status_get_type(status1); | |
1077 type2 = gaim_status_get_type(status2); | |
1078 | |
1079 if (gaim_status_is_active(status1)) | |
1080 score1 = primitive_scores[gaim_status_type_get_primitive(type1)]; | |
1081 | |
1082 if (gaim_status_is_active(status2)) | |
1083 score2 = primitive_scores[gaim_status_type_get_primitive(type2)]; | |
1084 | |
1085 if (score1 > score2) | |
1086 return -1; | |
1087 else if (score1 < score2) | |
1088 return 1; | |
1089 | |
1090 return 0; | |
1091 } | |
1092 | |
1093 | |
1094 /************************************************************************** | |
1095 * GaimPresence API | |
1096 **************************************************************************/ | |
1097 GaimPresence * | |
1098 gaim_presence_new(GaimPresenceContext context) | |
1099 { | |
1100 GaimPresence *presence; | |
1101 | |
1102 g_return_val_if_fail(context != GAIM_PRESENCE_CONTEXT_UNSET, NULL); | |
1103 | |
1104 presence = g_new0(GaimPresence, 1); | |
11187 | 1105 GAIM_DBUS_REGISTER_POINTER(presence, GaimPresence); |
9949 | 1106 |
1107 presence->context = context; | |
1108 | |
1109 presence->status_table = | |
10009 | 1110 g_hash_table_new_full(g_str_hash, g_str_equal, |
11638 | 1111 g_free, NULL); |
9949 | 1112 |
1113 return presence; | |
1114 } | |
1115 | |
1116 GaimPresence * | |
1117 gaim_presence_new_for_account(GaimAccount *account) | |
1118 { | |
10012 | 1119 GaimPresence *presence = NULL; |
9949 | 1120 g_return_val_if_fail(account != NULL, NULL); |
1121 | |
1122 presence = gaim_presence_new(GAIM_PRESENCE_CONTEXT_ACCOUNT); | |
1123 presence->u.account = account; | |
10006 | 1124 presence->statuses = gaim_prpl_get_statuses(account, presence); |
9949 | 1125 |
1126 return presence; | |
1127 } | |
1128 | |
1129 GaimPresence * | |
1130 gaim_presence_new_for_conv(GaimConversation *conv) | |
1131 { | |
1132 GaimPresence *presence; | |
1133 | |
1134 g_return_val_if_fail(conv != NULL, NULL); | |
1135 | |
1136 presence = gaim_presence_new(GAIM_PRESENCE_CONTEXT_CONV); | |
1137 presence->u.chat.conv = conv; | |
10006 | 1138 /* presence->statuses = gaim_prpl_get_statuses(conv->account, presence); ? */ |
9949 | 1139 |
1140 return presence; | |
1141 } | |
6216 | 1142 |
9949 | 1143 GaimPresence * |
1144 gaim_presence_new_for_buddy(GaimBuddy *buddy) | |
1145 { | |
1146 GaimPresence *presence; | |
1147 GaimStatusBuddyKey *key; | |
10006 | 1148 GaimAccount *account; |
9949 | 1149 |
1150 g_return_val_if_fail(buddy != NULL, NULL); | |
10012 | 1151 account = buddy->account; |
9949 | 1152 |
1153 key = g_new0(GaimStatusBuddyKey, 1); | |
1154 key->account = buddy->account; | |
1155 key->name = g_strdup(buddy->name); | |
10006 | 1156 |
1157 presence = g_hash_table_lookup(buddy_presences, key); | |
1158 if (presence == NULL) | |
9949 | 1159 { |
1160 presence = gaim_presence_new(GAIM_PRESENCE_CONTEXT_BUDDY); | |
1161 | |
1162 presence->u.buddy.name = g_strdup(buddy->name); | |
1163 presence->u.buddy.account = buddy->account; | |
10006 | 1164 presence->statuses = gaim_prpl_get_statuses(buddy->account, presence); |
9949 | 1165 |
1166 g_hash_table_insert(buddy_presences, key, presence); | |
1167 } | |
1168 else | |
1169 { | |
1170 g_free(key->name); | |
1171 g_free(key); | |
1172 } | |
1173 | |
1174 presence->u.buddy.ref_count++; | |
1175 presence->u.buddy.buddies = g_list_append(presence->u.buddy.buddies, | |
1176 buddy); | |
1177 | |
1178 return presence; | |
1179 } | |
1180 | |
1181 void | |
1182 gaim_presence_destroy(GaimPresence *presence) | |
1183 { | |
1184 g_return_if_fail(presence != NULL); | |
6216 | 1185 |
9949 | 1186 if (gaim_presence_get_context(presence) == GAIM_PRESENCE_CONTEXT_BUDDY) |
1187 { | |
1188 GaimStatusBuddyKey key; | |
1189 | |
10077 | 1190 if(presence->u.buddy.ref_count != 0) |
1191 return; | |
9949 | 1192 |
1193 key.account = presence->u.buddy.account; | |
1194 key.name = presence->u.buddy.name; | |
1195 | |
1196 g_hash_table_remove(buddy_presences, &key); | |
1197 | |
1198 if (presence->u.buddy.name != NULL) | |
1199 g_free(presence->u.buddy.name); | |
1200 } | |
1201 else if (gaim_presence_get_context(presence) == GAIM_PRESENCE_CONTEXT_CONV) | |
1202 { | |
1203 if (presence->u.chat.user != NULL) | |
1204 g_free(presence->u.chat.user); | |
1205 } | |
1206 | |
11638 | 1207 if (presence->statuses != NULL) { |
1208 g_list_foreach(presence->statuses, (GFunc)gaim_status_destroy, NULL); | |
9949 | 1209 g_list_free(presence->statuses); |
11638 | 1210 } |
9949 | 1211 |
1212 g_hash_table_destroy(presence->status_table); | |
1213 | |
11187 | 1214 GAIM_DBUS_UNREGISTER_POINTER(presence); |
9949 | 1215 g_free(presence); |
1216 } | |
1217 | |
10580 | 1218 /* |
1219 * TODO: Maybe we should cal gaim_presence_destroy() after we | |
1220 * decrement the ref count? I don't see why we should | |
1221 * make other places do it manually when we can do it here. | |
1222 */ | |
9949 | 1223 void |
1224 gaim_presence_remove_buddy(GaimPresence *presence, GaimBuddy *buddy) | |
1225 { | |
1226 g_return_if_fail(presence != NULL); | |
1227 g_return_if_fail(buddy != NULL); | |
1228 g_return_if_fail(gaim_presence_get_context(presence) == | |
1229 GAIM_PRESENCE_CONTEXT_BUDDY); | |
1230 | |
1231 if (g_list_find(presence->u.buddy.buddies, buddy) != NULL) | |
1232 { | |
1233 presence->u.buddy.buddies = g_list_remove(presence->u.buddy.buddies, | |
1234 buddy); | |
1235 presence->u.buddy.ref_count--; | |
1236 } | |
6065 | 1237 } |
1238 | |
9949 | 1239 void |
1240 gaim_presence_add_status(GaimPresence *presence, GaimStatus *status) | |
1241 { | |
1242 g_return_if_fail(presence != NULL); | |
1243 g_return_if_fail(status != NULL); | |
1244 | |
1245 presence->statuses = g_list_append(presence->statuses, status); | |
1246 | |
1247 g_hash_table_insert(presence->status_table, | |
1248 g_strdup(gaim_status_get_id(status)), status); | |
1249 } | |
1250 | |
1251 void | |
11318 | 1252 gaim_presence_add_list(GaimPresence *presence, const GList *source_list) |
9949 | 1253 { |
1254 const GList *l; | |
1255 | |
1256 g_return_if_fail(presence != NULL); | |
1257 g_return_if_fail(source_list != NULL); | |
1258 | |
1259 for (l = source_list; l != NULL; l = l->next) | |
1260 gaim_presence_add_status(presence, (GaimStatus *)l->data); | |
1261 } | |
1262 | |
1263 void | |
1264 gaim_presence_set_status_active(GaimPresence *presence, const char *status_id, | |
1265 gboolean active) | |
1266 { | |
1267 GaimStatus *status; | |
1268 | |
1269 g_return_if_fail(presence != NULL); | |
1270 g_return_if_fail(status_id != NULL); | |
1271 | |
1272 status = gaim_presence_get_status(presence, status_id); | |
1273 | |
1274 g_return_if_fail(status != NULL); | |
10348 | 1275 /* TODO: Should we do the following? */ |
1276 /* g_return_if_fail(active == status->active); */ | |
9949 | 1277 |
10067 | 1278 if (gaim_status_is_exclusive(status)) |
9949 | 1279 { |
1280 if (!active) | |
1281 { | |
1282 gaim_debug_warning("status", | |
1283 "Attempted to set a non-independent status " | |
1284 "(%s) inactive. Only independent statuses " | |
1285 "can be specifically marked inactive.", | |
1286 status_id); | |
1287 return; | |
1288 } | |
1289 } | |
1290 | |
1291 gaim_status_set_active(status, active); | |
1292 } | |
1293 | |
1294 void | |
1295 gaim_presence_switch_status(GaimPresence *presence, const char *status_id) | |
1296 { | |
10754 | 1297 gaim_presence_set_status_active(presence, status_id, TRUE); |
9949 | 1298 } |
1299 | |
1300 static void | |
1301 update_buddy_idle(GaimBuddy *buddy, GaimPresence *presence, | |
1302 time_t current_time, gboolean old_idle, gboolean idle) | |
1303 { | |
1304 GaimBlistUiOps *ops = gaim_get_blist()->ui_ops; | |
1305 | |
1306 if (!old_idle && idle) | |
1307 { | |
1308 gaim_signal_emit(gaim_blist_get_handle(), "buddy-idle", buddy); | |
1309 | |
1310 if (gaim_prefs_get_bool("/core/logging/log_system") && | |
1311 gaim_prefs_get_bool("/core/logging/log_idle_state")) | |
1312 { | |
1313 GaimLog *log = gaim_account_get_log(buddy->account); | |
1314 char *tmp = g_strdup_printf(_("%s became idle"), | |
1315 gaim_buddy_get_alias(buddy)); | |
1316 | |
1317 gaim_log_write(log, GAIM_MESSAGE_SYSTEM, | |
1318 gaim_buddy_get_alias(buddy), current_time, tmp); | |
1319 g_free(tmp); | |
1320 } | |
1321 } | |
1322 else if (old_idle && !idle) | |
1323 { | |
1324 gaim_signal_emit(gaim_blist_get_handle(), "buddy-unidle", buddy); | |
1325 | |
1326 if (gaim_prefs_get_bool("/core/logging/log_system") && | |
1327 gaim_prefs_get_bool("/core/logging/log_idle_state")) | |
1328 { | |
1329 GaimLog *log = gaim_account_get_log(buddy->account); | |
1330 char *tmp = g_strdup_printf(_("%s became unidle"), | |
1331 gaim_buddy_get_alias(buddy)); | |
1332 | |
1333 gaim_log_write(log, GAIM_MESSAGE_SYSTEM, | |
1334 gaim_buddy_get_alias(buddy), current_time, tmp); | |
1335 g_free(tmp); | |
1336 } | |
1337 } | |
1338 | |
10378 | 1339 gaim_contact_invalidate_priority_buddy(gaim_buddy_get_contact(buddy)); |
9949 | 1340 |
1341 if (ops != NULL && ops->update != NULL) | |
1342 ops->update(gaim_get_blist(), (GaimBlistNode *)buddy); | |
1343 } | |
1344 | |
1345 void | |
1346 gaim_presence_set_idle(GaimPresence *presence, gboolean idle, time_t idle_time) | |
1347 { | |
1348 gboolean old_idle; | |
1349 | |
1350 g_return_if_fail(presence != NULL); | |
1351 | |
1352 if (presence->idle == idle && presence->idle_time == idle_time) | |
1353 return; | |
1354 | |
1355 old_idle = presence->idle; | |
1356 presence->idle = idle; | |
1357 presence->idle_time = (idle ? idle_time : 0); | |
1358 | |
1359 if (gaim_presence_get_context(presence) == GAIM_PRESENCE_CONTEXT_BUDDY) | |
1360 { | |
1361 const GList *l; | |
1362 time_t current_time = time(NULL); | |
1363 | |
1364 for (l = gaim_presence_get_buddies(presence); l != NULL; l = l->next) | |
1365 { | |
1366 update_buddy_idle((GaimBuddy *)l->data, presence, current_time, | |
1367 old_idle, idle); | |
1368 } | |
1369 } | |
11551
78aad676fdb2
[gaim-migrate @ 13806]
Luke Schierer <lschiere@pidgin.im>
parents:
11522
diff
changeset
|
1370 else if(gaim_presence_get_context(presence) == GAIM_PRESENCE_CONTEXT_ACCOUNT) |
78aad676fdb2
[gaim-migrate @ 13806]
Luke Schierer <lschiere@pidgin.im>
parents:
11522
diff
changeset
|
1371 { |
78aad676fdb2
[gaim-migrate @ 13806]
Luke Schierer <lschiere@pidgin.im>
parents:
11522
diff
changeset
|
1372 GaimConnection *gc = |
78aad676fdb2
[gaim-migrate @ 13806]
Luke Schierer <lschiere@pidgin.im>
parents:
11522
diff
changeset
|
1373 gaim_account_get_connection(gaim_presence_get_account(presence)); |
78aad676fdb2
[gaim-migrate @ 13806]
Luke Schierer <lschiere@pidgin.im>
parents:
11522
diff
changeset
|
1374 GaimPluginProtocolInfo *prpl_info = NULL; |
78aad676fdb2
[gaim-migrate @ 13806]
Luke Schierer <lschiere@pidgin.im>
parents:
11522
diff
changeset
|
1375 |
78aad676fdb2
[gaim-migrate @ 13806]
Luke Schierer <lschiere@pidgin.im>
parents:
11522
diff
changeset
|
1376 if (gc != NULL && gc->prpl != NULL) |
78aad676fdb2
[gaim-migrate @ 13806]
Luke Schierer <lschiere@pidgin.im>
parents:
11522
diff
changeset
|
1377 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); |
78aad676fdb2
[gaim-migrate @ 13806]
Luke Schierer <lschiere@pidgin.im>
parents:
11522
diff
changeset
|
1378 |
78aad676fdb2
[gaim-migrate @ 13806]
Luke Schierer <lschiere@pidgin.im>
parents:
11522
diff
changeset
|
1379 if (prpl_info && g_list_find(gaim_connections_get_all(), gc) && |
78aad676fdb2
[gaim-migrate @ 13806]
Luke Schierer <lschiere@pidgin.im>
parents:
11522
diff
changeset
|
1380 prpl_info->set_idle) |
78aad676fdb2
[gaim-migrate @ 13806]
Luke Schierer <lschiere@pidgin.im>
parents:
11522
diff
changeset
|
1381 prpl_info->set_idle(gc, time(NULL) - idle_time); |
78aad676fdb2
[gaim-migrate @ 13806]
Luke Schierer <lschiere@pidgin.im>
parents:
11522
diff
changeset
|
1382 } |
9949 | 1383 } |
1384 | |
1385 void | |
10006 | 1386 gaim_presence_set_login_time(GaimPresence *presence, time_t login_time) |
1387 { | |
1388 g_return_if_fail(presence != NULL); | |
1389 | |
1390 if (presence->login_time == login_time) | |
1391 return; | |
1392 | |
1393 presence->login_time = login_time; | |
1394 } | |
1395 | |
9949 | 1396 GaimPresenceContext |
1397 gaim_presence_get_context(const GaimPresence *presence) | |
1398 { | |
1399 g_return_val_if_fail(presence != NULL, GAIM_PRESENCE_CONTEXT_UNSET); | |
1400 | |
1401 return presence->context; | |
1402 } | |
1403 | |
1404 GaimAccount * | |
1405 gaim_presence_get_account(const GaimPresence *presence) | |
1406 { | |
1407 GaimPresenceContext context; | |
1408 | |
1409 g_return_val_if_fail(presence != NULL, NULL); | |
1410 | |
1411 context = gaim_presence_get_context(presence); | |
1412 | |
1413 g_return_val_if_fail(context == GAIM_PRESENCE_CONTEXT_ACCOUNT || | |
1414 context == GAIM_PRESENCE_CONTEXT_BUDDY, NULL); | |
1415 | |
1416 return presence->u.account; | |
1417 } | |
1418 | |
1419 GaimConversation * | |
1420 gaim_presence_get_conversation(const GaimPresence *presence) | |
1421 { | |
1422 g_return_val_if_fail(presence != NULL, NULL); | |
1423 g_return_val_if_fail(gaim_presence_get_context(presence) == | |
1424 GAIM_PRESENCE_CONTEXT_CONV, NULL); | |
1425 | |
1426 return presence->u.chat.conv; | |
1427 } | |
1428 | |
1429 const char * | |
1430 gaim_presence_get_chat_user(const GaimPresence *presence) | |
1431 { | |
1432 g_return_val_if_fail(presence != NULL, NULL); | |
1433 g_return_val_if_fail(gaim_presence_get_context(presence) == | |
1434 GAIM_PRESENCE_CONTEXT_CONV, NULL); | |
1435 | |
1436 return presence->u.chat.user; | |
1437 } | |
1438 | |
1439 const GList * | |
1440 gaim_presence_get_buddies(const GaimPresence *presence) | |
1441 { | |
1442 g_return_val_if_fail(presence != NULL, NULL); | |
1443 g_return_val_if_fail(gaim_presence_get_context(presence) == | |
1444 GAIM_PRESENCE_CONTEXT_BUDDY, NULL); | |
1445 | |
1446 return presence->u.buddy.buddies; | |
1447 } | |
1448 | |
1449 const GList * | |
1450 gaim_presence_get_statuses(const GaimPresence *presence) | |
1451 { | |
1452 g_return_val_if_fail(presence != NULL, NULL); | |
1453 | |
1454 return presence->statuses; | |
1455 } | |
1456 | |
1457 GaimStatus * | |
1458 gaim_presence_get_status(const GaimPresence *presence, const char *status_id) | |
1459 { | |
1460 GaimStatus *status; | |
10006 | 1461 const GList *l = NULL; |
9949 | 1462 |
1463 g_return_val_if_fail(presence != NULL, NULL); | |
1464 g_return_val_if_fail(status_id != NULL, NULL); | |
1465 | |
10006 | 1466 /* What's the purpose of this hash table? */ |
10012 | 1467 status = (GaimStatus *)g_hash_table_lookup(presence->status_table, |
10006 | 1468 status_id); |
10012 | 1469 |
10006 | 1470 if (status == NULL) { |
10012 | 1471 for (l = gaim_presence_get_statuses(presence); |
10006 | 1472 l != NULL && status == NULL; l = l->next) |
1473 { | |
1474 GaimStatus *temp_status = l->data; | |
10012 | 1475 |
10006 | 1476 if (!strcmp(status_id, gaim_status_get_id(temp_status))) |
1477 status = temp_status; | |
1478 } | |
1479 | |
1480 if (status != NULL) | |
1481 g_hash_table_insert(presence->status_table, | |
1482 g_strdup(gaim_status_get_id(status)), status); | |
10012 | 1483 } |
9949 | 1484 |
1485 return status; | |
1486 } | |
1487 | |
1488 GaimStatus * | |
1489 gaim_presence_get_active_status(const GaimPresence *presence) | |
1490 { | |
1491 g_return_val_if_fail(presence != NULL, NULL); | |
1492 | |
1493 return presence->active_status; | |
1494 } | |
1495 | |
1496 gboolean | |
1497 gaim_presence_is_available(const GaimPresence *presence) | |
1498 { | |
1499 GaimStatus *status; | |
1500 | |
1501 g_return_val_if_fail(presence != NULL, FALSE); | |
1502 | |
1503 status = gaim_presence_get_active_status(presence); | |
1504 | |
1505 return ((status != NULL && gaim_status_is_available(status)) && | |
1506 !gaim_presence_is_idle(presence)); | |
1507 } | |
1508 | |
1509 gboolean | |
1510 gaim_presence_is_online(const GaimPresence *presence) | |
1511 { | |
1512 GaimStatus *status; | |
1513 | |
1514 g_return_val_if_fail(presence != NULL, FALSE); | |
1515 | |
1516 if ((status = gaim_presence_get_active_status(presence)) == NULL) | |
1517 return FALSE; | |
1518 | |
10040
81059dce3aed
[gaim-migrate @ 10999]
Luke Schierer <lschiere@pidgin.im>
parents:
10013
diff
changeset
|
1519 return gaim_status_is_online(status); |
9949 | 1520 } |
1521 | |
1522 gboolean | |
1523 gaim_presence_is_status_active(const GaimPresence *presence, | |
1524 const char *status_id) | |
1525 { | |
1526 GaimStatus *status; | |
1527 | |
1528 g_return_val_if_fail(presence != NULL, FALSE); | |
1529 g_return_val_if_fail(status_id != NULL, FALSE); | |
1530 | |
1531 status = gaim_presence_get_status(presence, status_id); | |
1532 | |
1533 return (status != NULL && gaim_status_is_active(status)); | |
1534 } | |
1535 | |
1536 gboolean | |
1537 gaim_presence_is_status_primitive_active(const GaimPresence *presence, | |
1538 GaimStatusPrimitive primitive) | |
1539 { | |
1540 GaimStatus *status; | |
1541 GaimStatusType *status_type; | |
1542 | |
1543 g_return_val_if_fail(presence != NULL, FALSE); | |
1544 g_return_val_if_fail(primitive != GAIM_STATUS_UNSET, FALSE); | |
1545 | |
1546 status = gaim_presence_get_active_status(presence); | |
1547 status_type = gaim_status_get_type(status); | |
1548 | |
1549 if (gaim_status_type_get_primitive(status_type) == primitive) | |
1550 return TRUE; | |
6065 | 1551 |
1552 return FALSE; | |
1553 } | |
1554 | |
9949 | 1555 gboolean |
1556 gaim_presence_is_idle(const GaimPresence *presence) | |
6065 | 1557 { |
9949 | 1558 g_return_val_if_fail(presence != NULL, FALSE); |
1559 | |
11634 | 1560 return gaim_presence_is_online(presence) && presence->idle; |
6065 | 1561 } |
1562 | |
9949 | 1563 time_t |
1564 gaim_presence_get_idle_time(const GaimPresence *presence) | |
6065 | 1565 { |
9949 | 1566 g_return_val_if_fail(presence != NULL, 0); |
6065 | 1567 |
9949 | 1568 return presence->idle_time; |
1569 } | |
6065 | 1570 |
10567 | 1571 time_t |
1572 gaim_presence_get_login_time(const GaimPresence *presence) | |
1573 { | |
1574 g_return_val_if_fail(presence != NULL, 0); | |
1575 | |
1576 return presence->login_time; | |
1577 } | |
1578 | |
9949 | 1579 gint |
1580 gaim_presence_compare(const GaimPresence *presence1, | |
1581 const GaimPresence *presence2) | |
6065 | 1582 { |
9949 | 1583 gboolean idle1, idle2; |
10860 | 1584 time_t idle_time_1, idle_time_2; |
9949 | 1585 int score1 = 0, score2 = 0; |
1586 const GList *l; | |
6065 | 1587 |
9949 | 1588 if ((presence1 == NULL && presence2 == NULL) || (presence1 == presence2)) |
1589 return 0; | |
1590 else if (presence1 == NULL) | |
10151
d83e6f2125b1
[gaim-migrate @ 11228]
Christian Hammond <chipx86@chipx86.com>
parents:
10087
diff
changeset
|
1591 return 1; |
9949 | 1592 else if (presence2 == NULL) |
10151
d83e6f2125b1
[gaim-migrate @ 11228]
Christian Hammond <chipx86@chipx86.com>
parents:
10087
diff
changeset
|
1593 return -1; |
6065 | 1594 |
9949 | 1595 /* Compute the score of the first set of statuses. */ |
1596 for (l = gaim_presence_get_statuses(presence1); l != NULL; l = l->next) | |
1597 { | |
1598 GaimStatus *status = (GaimStatus *)l->data; | |
1599 GaimStatusType *type = gaim_status_get_type(status); | |
6065 | 1600 |
9949 | 1601 if (gaim_status_is_active(status)) |
1602 score1 += primitive_scores[gaim_status_type_get_primitive(type)]; | |
6065 | 1603 } |
1604 | |
9949 | 1605 /* Compute the score of the second set of statuses. */ |
10151
d83e6f2125b1
[gaim-migrate @ 11228]
Christian Hammond <chipx86@chipx86.com>
parents:
10087
diff
changeset
|
1606 for (l = gaim_presence_get_statuses(presence2); l != NULL; l = l->next) |
9949 | 1607 { |
1608 GaimStatus *status = (GaimStatus *)l->data; | |
1609 GaimStatusType *type = gaim_status_get_type(status); | |
6065 | 1610 |
9949 | 1611 if (gaim_status_is_active(status)) |
1612 score2 += primitive_scores[gaim_status_type_get_primitive(type)]; | |
6065 | 1613 } |
1614 | |
9949 | 1615 idle1 = gaim_presence_is_idle(presence1); |
1616 idle2 = gaim_presence_is_idle(presence2); | |
6065 | 1617 |
9949 | 1618 if (idle1) |
1619 score1 += primitive_scores[SCORE_IDLE]; | |
6065 | 1620 |
9949 | 1621 if (idle2) |
1622 score2 += primitive_scores[SCORE_IDLE]; | |
6065 | 1623 |
10860 | 1624 idle_time_1 = time(NULL) - gaim_presence_get_idle_time(presence1); |
1625 idle_time_2 = time(NULL) - gaim_presence_get_idle_time(presence2); | |
6065 | 1626 |
9949 | 1627 if (idle_time_1 > idle_time_2) |
1628 score1 += primitive_scores[SCORE_IDLE_TIME]; | |
1629 else if (idle_time_1 < idle_time_2) | |
1630 score2 += primitive_scores[SCORE_IDLE_TIME]; | |
6065 | 1631 |
9949 | 1632 if (score1 < score2) |
1633 return 1; | |
1634 else if (score1 > score2) | |
1635 return -1; | |
1636 | |
1637 return 0; | |
1638 } | |
1639 | |
6065 | 1640 |
9949 | 1641 /************************************************************************** |
1642 * Status subsystem | |
1643 **************************************************************************/ | |
1644 static void | |
1645 score_pref_changed_cb(const char *name, GaimPrefType type, gpointer value, | |
1646 gpointer data) | |
1647 { | |
1648 int index = GPOINTER_TO_INT(data); | |
6065 | 1649 |
9949 | 1650 primitive_scores[index] = GPOINTER_TO_INT(value); |
6065 | 1651 } |
1652 | |
10519 | 1653 static guint |
10006 | 1654 gaim_buddy_presences_hash(gconstpointer key) |
1655 { | |
10012 | 1656 const GaimStatusBuddyKey *me = key; |
1657 guint ret; | |
1658 char *str; | |
1659 | |
1660 str = g_strdup_printf("%p%s", me->account, me->name); | |
1661 ret = g_str_hash(str); | |
1662 g_free(str); | |
1663 | |
1664 return ret; | |
10006 | 1665 } |
1666 | |
10519 | 1667 static gboolean |
10006 | 1668 gaim_buddy_presences_equal(gconstpointer a, gconstpointer b) |
1669 { | |
1670 GaimStatusBuddyKey *key_a = (GaimStatusBuddyKey *)a; | |
1671 GaimStatusBuddyKey *key_b = (GaimStatusBuddyKey *)b; | |
1672 | |
10012 | 1673 if(key_a->account == key_b->account && |
1674 !strcmp(key_a->name, key_b->name)) | |
10006 | 1675 return TRUE; |
1676 else | |
1677 return FALSE; | |
1678 } | |
1679 | |
10519 | 1680 static void |
1681 gaim_buddy_presences_key_free(gpointer a) | |
1682 { | |
1683 GaimStatusBuddyKey *key = (GaimStatusBuddyKey *)a; | |
1684 g_free(key->name); | |
1685 g_free(key); | |
1686 } | |
1687 | |
10087 | 1688 void * |
10418 | 1689 gaim_status_get_handle(void) { |
10087 | 1690 static int handle; |
1691 | |
1692 return &handle; | |
1693 } | |
1694 | |
9949 | 1695 void |
10418 | 1696 gaim_status_init(void) |
6065 | 1697 { |
10418 | 1698 void *handle = gaim_status_get_handle; |
10087 | 1699 |
9949 | 1700 gaim_prefs_add_none("/core/status"); |
1701 gaim_prefs_add_none("/core/status/scores"); | |
6065 | 1702 |
9949 | 1703 gaim_prefs_add_int("/core/status/scores/offline", |
1704 primitive_scores[GAIM_STATUS_OFFLINE]); | |
1705 gaim_prefs_add_int("/core/status/scores/available", | |
1706 primitive_scores[GAIM_STATUS_AVAILABLE]); | |
1707 gaim_prefs_add_int("/core/status/scores/hidden", | |
1708 primitive_scores[GAIM_STATUS_HIDDEN]); | |
1709 gaim_prefs_add_int("/core/status/scores/away", | |
1710 primitive_scores[GAIM_STATUS_AWAY]); | |
1711 gaim_prefs_add_int("/core/status/scores/extended_away", | |
1712 primitive_scores[GAIM_STATUS_EXTENDED_AWAY]); | |
1713 gaim_prefs_add_int("/core/status/scores/idle", | |
1714 primitive_scores[SCORE_IDLE]); | |
6065 | 1715 |
10087 | 1716 gaim_prefs_connect_callback(handle, "/core/status/scores/offline", |
9949 | 1717 score_pref_changed_cb, |
1718 GINT_TO_POINTER(GAIM_STATUS_OFFLINE)); | |
10087 | 1719 gaim_prefs_connect_callback(handle, "/core/status/scores/available", |
9949 | 1720 score_pref_changed_cb, |
1721 GINT_TO_POINTER(GAIM_STATUS_AVAILABLE)); | |
10087 | 1722 gaim_prefs_connect_callback(handle, "/core/status/scores/hidden", |
9949 | 1723 score_pref_changed_cb, |
1724 GINT_TO_POINTER(GAIM_STATUS_HIDDEN)); | |
10087 | 1725 gaim_prefs_connect_callback(handle, "/core/status/scores/away", |
9949 | 1726 score_pref_changed_cb, |
1727 GINT_TO_POINTER(GAIM_STATUS_AWAY)); | |
10087 | 1728 gaim_prefs_connect_callback(handle, "/core/status/scores/extended_away", |
9949 | 1729 score_pref_changed_cb, |
1730 GINT_TO_POINTER(GAIM_STATUS_EXTENDED_AWAY)); | |
10087 | 1731 gaim_prefs_connect_callback(handle, "/core/status/scores/idle", |
9949 | 1732 score_pref_changed_cb, |
1733 GINT_TO_POINTER(SCORE_IDLE)); | |
10006 | 1734 |
10519 | 1735 buddy_presences = g_hash_table_new_full(gaim_buddy_presences_hash, |
1736 gaim_buddy_presences_equal, | |
1737 gaim_buddy_presences_key_free, NULL); | |
9949 | 1738 } |
6065 | 1739 |
9949 | 1740 void |
10418 | 1741 gaim_status_uninit(void) |
9949 | 1742 { |
10176
0109f3a518d2
[gaim-migrate @ 11291]
Christian Hammond <chipx86@chipx86.com>
parents:
10153
diff
changeset
|
1743 if (buddy_presences != NULL) |
0109f3a518d2
[gaim-migrate @ 11291]
Christian Hammond <chipx86@chipx86.com>
parents:
10153
diff
changeset
|
1744 { |
10077 | 1745 g_hash_table_destroy(buddy_presences); |
10176
0109f3a518d2
[gaim-migrate @ 11291]
Christian Hammond <chipx86@chipx86.com>
parents:
10153
diff
changeset
|
1746 |
0109f3a518d2
[gaim-migrate @ 11291]
Christian Hammond <chipx86@chipx86.com>
parents:
10153
diff
changeset
|
1747 buddy_presences = NULL; |
0109f3a518d2
[gaim-migrate @ 11291]
Christian Hammond <chipx86@chipx86.com>
parents:
10153
diff
changeset
|
1748 } |
9949 | 1749 } |