Mercurial > hg
comparison mcabber/src/roster.c @ 843:915a7f17474a
Remember the status message when a buddy goes offline
This is useful when people use a status message when leaving,
or with some Jabber transports.
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Sat, 06 May 2006 12:59:04 +0200 |
parents | c2d7d9dd4193 |
children | a9161d2dc414 |
comparison
equal
deleted
inserted
replaced
842:f74c5c6d2c24 | 843:915a7f17474a |
---|---|
66 /* For groupchats */ | 66 /* For groupchats */ |
67 gchar *nickname; | 67 gchar *nickname; |
68 gchar *topic; | 68 gchar *topic; |
69 guint8 inside_room; | 69 guint8 inside_room; |
70 | 70 |
71 /* To keep track of last status message */ | |
72 gchar *offline_status_message; | |
73 | |
71 /* Flag used for the UI */ | 74 /* Flag used for the UI */ |
72 guint flags; | 75 guint flags; |
73 | 76 |
74 // list: user -> points to his group; group -> points to its users list | 77 // list: user -> points to his group; group -> points to its users list |
75 GSList *list; | 78 GSList *list; |
182 } | 185 } |
183 | 186 |
184 if (!p_res_elt) return; // Resource not found | 187 if (!p_res_elt) return; // Resource not found |
185 | 188 |
186 p_res = p_res_elt->data; | 189 p_res = p_res_elt->data; |
190 | |
191 // Keep a copy of the status message when a buddy goes offline | |
192 if (g_slist_length(rost->resource) == 1) { | |
193 g_free(rost->offline_status_message); | |
194 rost->offline_status_message = p_res->status_msg; | |
195 p_res->status_msg = NULL; | |
196 } | |
197 | |
187 // Free allocations and delete resource node | 198 // Free allocations and delete resource node |
188 g_free(p_res->name); | 199 g_free(p_res->name); |
189 g_free(p_res->status_msg); | 200 g_free(p_res->status_msg); |
190 g_free(p_res->realjid); | 201 g_free(p_res->realjid); |
191 rost->resource = g_slist_delete_link(rost->resource, p_res_elt); | 202 rost->resource = g_slist_delete_link(rost->resource, p_res_elt); |
362 // Let's free memory (jid, name, status message) | 373 // Let's free memory (jid, name, status message) |
363 g_free((gchar*)roster_usr->jid); | 374 g_free((gchar*)roster_usr->jid); |
364 g_free((gchar*)roster_usr->name); | 375 g_free((gchar*)roster_usr->name); |
365 g_free((gchar*)roster_usr->nickname); | 376 g_free((gchar*)roster_usr->nickname); |
366 g_free((gchar*)roster_usr->topic); | 377 g_free((gchar*)roster_usr->topic); |
378 g_free((gchar*)roster_usr->offline_status_message); | |
367 free_all_resources(&roster_usr->resource); | 379 free_all_resources(&roster_usr->resource); |
368 g_free(roster_usr); | 380 g_free(roster_usr); |
369 | 381 |
370 // That's a little complex, we need to dereference twice | 382 // That's a little complex, we need to dereference twice |
371 sl_group = ((roster*)sl_user->data)->list; | 383 sl_group = ((roster*)sl_user->data)->list; |
404 // Free name and jid | 416 // Free name and jid |
405 g_free((gchar*)roster_usr->jid); | 417 g_free((gchar*)roster_usr->jid); |
406 g_free((gchar*)roster_usr->name); | 418 g_free((gchar*)roster_usr->name); |
407 g_free((gchar*)roster_usr->nickname); | 419 g_free((gchar*)roster_usr->nickname); |
408 g_free((gchar*)roster_usr->topic); | 420 g_free((gchar*)roster_usr->topic); |
421 g_free((gchar*)roster_usr->offline_status_message); | |
409 free_all_resources(&roster_usr->resource); | 422 free_all_resources(&roster_usr->resource); |
410 g_free(roster_usr); | 423 g_free(roster_usr); |
411 sl_usr = g_slist_next(sl_usr); | 424 sl_usr = g_slist_next(sl_usr); |
412 } | 425 } |
413 // Free group's users list | 426 // Free group's users list |
450 // If there is no resource name, we can leave now | 463 // If there is no resource name, we can leave now |
451 if (!resname) return; | 464 if (!resname) return; |
452 | 465 |
453 roster_usr = (roster*)sl_user->data; | 466 roster_usr = (roster*)sl_user->data; |
454 | 467 |
455 // If bstat is offline, we MUST delete the resource, actually | |
456 if (bstat == offline) { | |
457 del_resource(roster_usr, resname); | |
458 return; | |
459 } | |
460 | |
461 // New or updated resource | 468 // New or updated resource |
462 p_res = get_or_add_resource(roster_usr, resname, prio); | 469 p_res = get_or_add_resource(roster_usr, resname, prio); |
463 p_res->prio = prio; | 470 p_res->prio = prio; |
464 p_res->status = bstat; | 471 p_res->status = bstat; |
465 if (p_res->status_msg) { | 472 if (p_res->status_msg) { |
479 g_free((gchar*)p_res->realjid); | 486 g_free((gchar*)p_res->realjid); |
480 p_res->realjid = NULL; | 487 p_res->realjid = NULL; |
481 } | 488 } |
482 if (realjid) | 489 if (realjid) |
483 p_res->realjid = g_strdup(realjid); | 490 p_res->realjid = g_strdup(realjid); |
491 | |
492 // If bstat is offline, we MUST delete the resource, actually | |
493 if (bstat == offline) { | |
494 del_resource(roster_usr, resname); | |
495 return; | |
496 } | |
484 } | 497 } |
485 | 498 |
486 // roster_setflags() | 499 // roster_setflags() |
487 // Set one or several flags to value (TRUE/FALSE) | 500 // Set one or several flags to value (TRUE/FALSE) |
488 void roster_setflags(const char *jid, guint flags, guint value) | 501 void roster_setflags(const char *jid, guint flags, guint value) |
613 | 626 |
614 roster_usr = (roster*)sl_user->data; | 627 roster_usr = (roster*)sl_user->data; |
615 p_res = get_resource(roster_usr, resname); | 628 p_res = get_resource(roster_usr, resname); |
616 if (p_res) | 629 if (p_res) |
617 return p_res->status_msg; | 630 return p_res->status_msg; |
618 return NULL; | 631 return roster_usr->offline_status_message; |
619 } | 632 } |
620 | 633 |
621 guint roster_gettype(const char *jid) | 634 guint roster_gettype(const char *jid) |
622 { | 635 { |
623 GSList *sl_user; | 636 GSList *sl_user; |
971 { | 984 { |
972 roster *roster_usr = rosterdata; | 985 roster *roster_usr = rosterdata; |
973 res *p_res = get_resource(roster_usr, resname); | 986 res *p_res = get_resource(roster_usr, resname); |
974 if (p_res) | 987 if (p_res) |
975 return p_res->status_msg; | 988 return p_res->status_msg; |
976 return NULL; | 989 return roster_usr->offline_status_message; |
977 } | 990 } |
978 | 991 |
979 time_t buddy_getstatustime(gpointer rosterdata, const char *resname) | 992 time_t buddy_getstatustime(gpointer rosterdata, const char *resname) |
980 { | 993 { |
981 roster *roster_usr = rosterdata; | 994 roster *roster_usr = rosterdata; |