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;